1

我正在尝试将 XML 文件读入 DataTable 并且我很难匹配架构并正确转换它。这就是 XML 的样子……

<?xml version="1.0" encoding="utf-8"?>
<School>
  <Teacher>
    <Name>Teacher1</Name>
    <Student>
      <Student-Name>Student1</Student-Name>
      <Gender>M</Gender>
      <Address>Address1</Address>
    </Student>
    <Student>
      <Student-Name>Student2</Student-Name>
      <Gender>F</Gender>
      <Address>Address2</Address>
    </Student>
  </Teacher>
  <Teacher>
    <Name>Teacher2</Name>
    <Student>
      <Student-Name>Student3</Student-Name>
      <Gender>F</Gender>
      <Address>Address3</Address>
    </Student>
  </Teacher>
</School>

我需要将它添加到 DataTable 中,以便表格看起来像这样

姓名 学生姓名 性别 地址
-------------------------------------------------------- -------- Teacher1
Student1 M Address1 Teacher1 Student2 F Address2 Teacher2 Student3 F Address3

DataTable.ReadXML() --> 不允许我读入这个 XML 文件。该错误表明 DataTable 不支持模式推断
DataSet.ReadXML() --> 不接受模式并将其分成两个表,第一个是教师表,第二个是学生表,即使它设置为推断架构。

另一个问题是我正在使用几种类型的 XML 文件执行此操作。所有这些都在学生中嵌套了不同数量的节点,我需要将其设为通用,以便无论节点数量如何,它都可以读取 XML。

我想知道是否需要设置一个 XmlReader 来读取它,或者是否需要使用 DataSet.ReadXML()/DataTable.ReadXML() 上的任何设置。谢谢你。

4

2 回答 2

0

如果您熟悉 Xsd.exe(Visual Studio 中的一个工具),您可以从 XML 数据生成类,这将允许您直接从 XML 批量加载数据到生成的类中。

于 2013-07-01T17:31:04.767 回答
0

您遇到此问题是因为您正在使用 a DataTable(不是 a DataSet)并且XML尚未定义您的架构。

这是一个示例,其中SQL数据以DataTable

Dim sTable As String = "payement"
Dim sFileName = "db.select." & sTable & ".xml"
Dim cmd = New NpgsqlCommand(sSQL, npgconx)
Dim rxSheet as IDataReader= cmd.ExecuteReader()

Dim dtSheet = New DataTable(sTable)
dtSheet.Load(rxSheet)
dtSheet.WriteXml(sFileName)
dtSheet.WriteXmlSchema(sFileName.Replace(".xml", ".Schema.xml"))

在这段代码中,在文件中导出SQL数据后,函数用于导出模式。XMLWriteXmlSchema()XML

现在,相同的数据被导入DataTable

Dim sTable As String = "payement"
Dim sFileName = "db.select." & sTable & ".xml"
Dim dtSheet = New DataTable(sTable)
dtSheet.ReadXmlSchema(sFileName.Replace(".xml", ".Schema.xml"))
dtSheet.ReadXml(sFileName)

重要的是ReadXmlSchema()函数在函数之前执行ReadXml()

WriteXml()函数中,传递表的名称也很重要。

当记录数非常多时,我使用此代码序列化我的 PC 上的 SELECT SQL 命令返回的元组,所以下次我想测试我的程序时,我不会用我的大提取加载数据库......有时我不会不要等待很多时间。

于 2022-02-11T09:12:05.707 回答