我正在尝试序列化XML文件,我正面临一些问题。请查看我的xml示例文件:
<Information xmlns="dis">
<SOS.Alert>
<signal>4</signal>
<tresh>RTX</tresh>
<obb>GGHUI</obb>
</SOS.Alert>
<SOS.Alert>
<signal>3</signal>
<tresh>RTR</tresh>
<obb>GGH</obb>
</SOS.Alert>
<SOS.Alert>
<signal>20</signal>
<tresh>WWRTX</tresh>
<obb>BBHUI</obb>
</SOS.Alert>
<SOS.Alert>
<signal>13</signal>
<tresh>DRTR</tresh>
<obb>GFH</obb>
</SOS.Alert>
....
</Information>
问题是它正在跳过每一秒“秒”。因此,如果我们有4个输入,如上所述,只有两个将被序列化:
<SOS.Alert>
<signal>4</signal>
<tresh>RTX</tresh>
<obb>GGHUI</obb>
</SOS.Alert>
<SOS.Alert>
<signal>20</signal>
<tresh>WWRTX</tresh>
<obb>BBHUI</obb>
</SOS.Alert>
这是我正在使用的代码:
Me.xmlreader = New XmlTextReader(inputFileName)
Me.xmlreader.WhitespaceHandling = WhitespaceHandling.None
While (Me.xmlreader.Read())
If ((Me.xmlreader.Name = "SOS.Alert") And (Me.xmlreader.NodeType = XmlNodeType.Element) And (Me.xmlreader.IsStartElement())) Then
Me.data.MyList.Add(xmlreader.ReadOuterXml)
End If
End While
请注意,我希望继续使用XMLTeamReader,因为我在大型XML文件上操作超过1,5gb,并且XDocument,XElement和其他文件没有被考虑在内,因为它们将整个XML加载到内存中,因此OutoOfMemory异常。
答案 0 :(得分:1)
我认为问题是ReadOuterXml
电话。看看这篇MSDN文章,特别是备注表,显示&#34;通话后的位置&#34;:http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readouterxml%28v=vs.110%29.aspx
它显示了这个XML:
<item1>text1</item1><item2>text2</item2>
如果您在Item1中调用ReadOuterXml
,它会将阅读器转发到Item2。因为这发生在循环内,读者将再次前进并超过第二个项目的开始标记。这将导致您跳过&#34;
答案 1 :(得分:0)
在ReadOuterXml之后,阅读器已经位于您的下一个所需节点,即您的第二个SOS.Alert。但是由于Me.xmlreader.Read()
调用,xml中的下一个项目被读取signal
。这太过分了。现在,您阅读了您看到第三个SOS.Alert的节点。
我想你需要下面的代码。找到第一个SOS.Alert后,它将继续阅读SOS.Alert分支直到结束。
Me.xmlreader = New XmlTextReader(inputFileName)
Me.xmlreader.WhitespaceHandling = WhitespaceHandling.None
While (Me.xmlreader.Read())
If ((Me.xmlreader.Name = "SOS.Alert") And (Me.xmlreader.NodeType = XmlNodeType.Element) And (Me.xmlreader.IsStartElement())) Then
While ((Me.xmlreader.Name = "SOS.Alert") And (Me.xmlreader.NodeType = XmlNodeType.Element) And (Me.xmlreader.IsStartElement()))
Me.data.MyList.Add(xmlreader.ReadOuterXml)
End While
End If
End While