【问题标题】:Read XML into DataTable. Need to match Schema将 XML 读入 DataTable。需要匹配Schema
【发布时间】:2013-07-01 17:27:16
【问题描述】:

我正在尝试将 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 中,以便表格看起来像这样

姓名           学生姓名    性别    地址
-------------------------------------------------- --
老师 1    学生 1             M    地址 1
教师 1    学生 2             F    地址 2
教师 2    学生 3                                                                                                                                                                                                                                                                                               ,

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

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

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

【问题讨论】:

    标签: c# asp.net xml


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我最终只是合并了由 DataSet.ReadXml() 创建的两个表,因为它们被分配了一个额外的值,将嵌套节点与父节点相关联。
    【解决方案2】:

    您遇到此问题是因为您使用的是DataTable(不是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"))
    

    在这段代码中,在刚刚导出XML文件中的SQL数据后,WriteXmlSchema()函数用于导出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 命令返回的元组,所以下次我想测试我的程序时,我不会用我的大提取加载数据库......还有一些时间我不会等待很多时间。

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      相关资源
      最近更新 更多