我正在尝试将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,学生1,学生1,学生1,学生1,学生1,学生1,学生3,学生3,教师3,教师3,教师3,教师3,教师3,学生1,学生1,学生3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
教师1:学生2:* Address2
教师2,学生3,学生,
DataTable.ReadXML() -->不允许我读入这个XML文件。该错误表明DataTable不支持架构推断
DataSet.ReadXML() -->不提取模式并将其分成两个表,第一个是教师表,第二个是学生表,即使它被设置为推断模式也是如此。
另一个问题是,我正在对几种类型的XML文件执行此操作。所有这些节点都有不同数量的节点嵌套在学生中,我需要将其泛化,以便它可以读取XML,而不管节点的数量有多少。
我想知道是否需要设置一个XmlReader来读入此内容,或者是否需要使用DataSet.ReadXML()/DataTable.ReadXML()上的任何设置。谢谢。
发布于 2013-07-02 01:31:05
如果您熟悉Xsd.exe ( visual studio中的一个工具),则可以从XML数据生成类,这将允许您将数据直接从XML批量加载到生成的类中。
发布于 2022-02-11 09:12:06
之所以会遇到这个问题,是因为您使用的是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"))在此代码中,在将SQL数据导出到XML文件之后,使用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命令返回的元组,所以下次我想测试我的程序时,我不会用我的大提取来加载DataBase……有时候我不会等太多时间。
https://stackoverflow.com/questions/17410239
复制相似问题