我正在读取一个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>
读取任何内容,我认为这很好,因为只有子元素(子元素?后代?这里不完全确定正确的术语)。
答案 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