首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从XML读取跳过第一行?

从XML读取跳过第一行?
EN

Stack Overflow用户
提问于 2015-01-28 21:13:27
回答 1查看 719关注 0票数 0

我正在从一个XML文件中读取数据,而阅读器似乎不仅跳过了第一个子元素,而且通过调试,它似乎根本不存在。

代码语言:javascript
复制
 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

除了下面这样的第一个子元素之外,上述所有代码都可以工作:

代码语言:javascript
复制
<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>中读取任何内容,我认为这很好,因为只有子元素(子元素)?后代?这里不完全确定合适的术语)。

EN

回答 1

Stack Overflow用户

发布于 2015-01-28 22:18:26

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28202486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档