xmlreader每隔一步读取一次

时间:2015-01-07 10:41:39

标签: vb.net

我正在尝试序列化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异常。

2 个答案:

答案 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