阅读XML跳过第一行?

时间:2015-01-28 21:13:27

标签: xml vb.net

我正在读取一个XML文件,读者不仅似乎正在跳过第一个子元素,而且通过调试它就像它甚至不存在一样。

 While reader.Read

            Select Case reader.NodeType
                Case XmlNodeType.Comment

                Case XmlNodeType.Element


                    ElementNames.SetValue(reader.LocalName, ElementCount)
                    ElementText.SetValue(reader.ReadString, ElementCount)
                    ElementCount += 1
                    ReDim Preserve ElementNames(ElementCount)
                    ReDim Preserve ElementText(ElementCount)


            End Select
        End While

编辑1:我在Case XmlNodeType.Element内的代码周围乱窜,虽然几乎所有代码都工作正常,因为正在阅读<Obit>它接近案例的结尾我刚刚提到并立即读取<unique-id>,所以当它循环回While reader.Read时,它实际上正在读取<unique-id>的TEXT,这似乎弄乱了它。然后,一切都正常进行。所以现在,我不知道如何做到这一点。我不能再次使用reader.Read,因为这只是推动了一切。 END EDIT 1

除了像这样的第一个子元素之外,以上所有代码都有效:

<Obit>
  <unique-id>1</unique-id> '(this line is skipped)
  <year-born>1907</year-born>
  <date-of-death>
    <day>03</day> '(this line is skipped)
    <month>04</month>
    <year>1947</year>
  </date-of-death>
  <obit-text>qqqqqqqqqqqqqqqqqqq</obit-text>
</Obit>

我指出了哪些行被跳过。现在,如果我改为在第一行写一条XML注释,则会跳过注释并获取所有信息。

XMLReader或第一行有一些棘手的问题吗? 就像我说的那样,当我调试它时,我通过它显示它正在我的Select语句中的<Obit>行上读取ElementNames.SetValue(reader.LocalName, ElementCount)。它进展到下一个节点,似乎只是一起跳过它。

<Obit>中是否有任何文本/字符串是可能的失败点? ElementText.SetValue(reader.ReadString, ElementCount)行显示没有从<Obit>读取任何内容,我认为这很好,因为只有子元素(子元素?后代?这里不完全确定正确的术语)。

1 个答案:

答案 0 :(得分:1)

您的问题似乎是您正在使用reader.ReadString,它将下一个节点作为字符串读取。您想要的是Read()文本元素并使用reader.Value。这突出了另一个问题,即如果没有文本,它将读取换行符。一个简单的条件将解决这个问题:

While reader.Read

    Select Case reader.NodeType
        Case XmlNodeType.Comment

        Case XmlNodeType.Element


            ElementNames.SetValue(reader.LocalName, ElementCount)
            reader.Read()
            Dim textValue As String = reader.Value
            If textValue.StartsWith(vbLf) Then
                textValue = ""
            End If
            ElementText.SetValue(textValue, ElementCount)
            ElementCount += 1
            ReDim Preserve ElementNames(ElementCount)
            ReDim Preserve ElementText(ElementCount)
    End Select
End While

另外,使用并发数组可能会导致大型项目出现许多问题。我建议使用自定义类或结构,并创建这些对象的列表:

Class ElementValue
    Public Name As String = ""
    Public Text As String = ""
End Class

Dim ElementValueList As New List(Of ElementValue)

While reader.Read
    Select Case reader.NodeType
        Case XmlNodeType.Comment

        Case XmlNodeType.Element

            Dim temp As New ElementValue
            temp.Name = reader.LocalName
            reader.Read()
            Dim textValue As String = reader.Value
            If textValue.StartsWith(vbLf) Then
                textValue = ""
            End If
            temp.Text = textValue
            ElementValueList.Add(temp)
    End Select
End While