我正在从一个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>的文本,这似乎使它变得一团糟。然后,一切正常进行。所以现在,我不知道怎样才能让它不那么做。我不能再使用reader.Read了,因为这只会推动一切向前发展。终端编辑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>中读取任何内容,我认为这很好,因为只有子元素(子元素)?后代?这里不完全确定合适的术语)。
发布于 2015-01-28 22:18:26
您的问题似乎是使用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 Whilehttps://stackoverflow.com/questions/28202486
复制相似问题