我需要读入各种类型的xml文件并解析数据。似乎将文件读取到数据集中是一种方法,但我在这样做时遇到了麻烦
我想知道我的测试文件是否格式不正确,但我下载了一个示例文件和模式,但也失败了。所有文件都加载到一个文档中,根据这个测试代码:
Dim ds As New DataSet()
For thisFile As Integer = 0 To readFiles.Count - 1
frmMain.UpdateInfo(readFiles.Item(thisFile), "I") ' tell the user
Dim doc As New Xml.XmlDocument
doc.Load(readFiles.Item(thisFile)) ' this works
Dim thisFileReader As System.IO.StringReader = New System.IO.StringReader(readFiles.Item(thisFile))
ds.Clear()
ds.ReadXml(thisFileReader, XmlReadMode.IgnoreSchema) ' this fails with "Data at the root level is invalid. Line 1, position 1."
For Each thisTable As DataTable In ds.Tables
' action...
Next
Next
示例文件如下所示:
<?xml version="1.0" encoding="UTF-8"?><shiporder orderid="889923" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="shiporder.xsd"><orderperson>John Smith</orderperson><shipto><name>Ola Nordmann</name><address>Langgt 23</address><city>4000 Stavanger</city><country>Norway</country></shipto><item><title>Empire Burlesque</title><note>Special Edition</note><quantity>1</quantity><price>10.90</price></item><item><title>Hide your heart</title><quantity>1</quantity><price>9.90</price></item></shiporder>
(注意,我有意删除格式,因为我将要阅读的文件是相似的。)
示例模式如下:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="shiporder">
<xs:complexType>
<xs:sequence>
<xs:element name="orderperson" type="xs:string"/>
<xs:element name="shipto">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
两者都在同一个文件夹中进行测试,尽管我认为在将读取模式设置为IgnoreSchema时不应该使用该模式。
我确信我错过了一些非常简单的事情。。。
尝试使用StreamReader
而不是StringReader
,并尝试不使用XmlReadMode.IgnoreSchema
。
Dim thisFileReader As System.IO.StreamReader = New System.IO.StringReader(readFiles.Item(thisFile))
ds.Clear()
ds.ReadXml(thisFileReader)