将XML读取到DataTable中.需要匹配架构
本文关键字:XML 读取 DataTable | 更新日期: 2023-09-27 18:20:31
我正试图将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中,使其看起来像这个
名称 nbsp nbsp nbsp nbsp 学生姓名 nbsp;性别 nbsp;地址
----------------------------------------------------
教师1 nbsp;学生1 nbsp nbsp nbsp nbsp nbsp M nbsp;地址1
教师1 nbsp;学生2 nbsp nbsp nbsp nbsp nbsp F nbsp;地址2
教师2 nbsp;学生3 nbsp nbsp nbsp nbsp nbsp F nbsp;地址3
DataTable.ReadXML()-->不允许我读取此XML文件。错误表明DataTable不支持模式推断
DataSet.ReadXML()-->不会获取架构,并将其分为两个表,第一个是教师表,第二个是学生表,即使设置为推断架构也是如此。
另一个问题是,我使用了几种类型的XML文件。所有这些都在学生中嵌套了不同数量的节点,我需要使其通用,以便它可以读取XML,而不管节点数量如何。
我想知道我是否需要设置一个XmlReader来读取它,或者我是否需要使用DataSet.ReadXML()/DataTable.ReadXML()上的任何设置。非常感谢。
如果您熟悉Xsd.exe(visualstudio中的一个工具),您可以从XML数据生成Classes,这将允许您直接从XML批量加载数据到生成的Classes中。
您遇到这个问题是因为您使用的是DataTable
(而不是DataSet
),而您的XML
模式尚未定义。
以下是在DataTable
中导出SQL
数据的示例
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)
在执行ReadXml()
功能之前执行ReadXmlSchema()
功能是很重要的。
在WriteXml()
函数中,传递表的名称也很重要。
当记录数量非常高时,我使用此代码在我的PC上序列化SELECT SQL命令返回的元组,所以下次我想测试我的程序时,我不会用我的大提取加载数据库。。。有时我不会等太久。