XmlReader对元素之间的空白感到敏感

时间:2017-10-01 22:44:32

标签: c# .net xml xmlreader

XML阅读器似乎对空元素周围的空白区域很敏感。

如果我有一个没有空格的空元素(<B />),则读者不会将其视为元素。

public static void Main()
{
    WriteLine("No spaces around <B>.");
    using (var stringReader = new StringReader(@"<Index><A>a</A><B /><C>c</C></Index>"))
    using (var reader = XmlReader.Create(stringReader))
    {
        while (reader.Read())
        {
            if (reader.Name != "Index" && reader.NodeType == XmlNodeType.Element)
            {
                WriteLine("{0}: {1}", reader.Name, reader.ReadElementContentAsString());
            }
        }
    }
    WriteLine();
    WriteLine("Spaces added around <B>.");
    using (var stringReader = new StringReader(@"<Index><A>a</A> <B /> <C>c</C></Index>"))
    using (var reader = XmlReader.Create(stringReader))
    {
        while (reader.Read())
        {
            if (reader.Name != "Index" && reader.NodeType == XmlNodeType.Element)
            {
                WriteLine("{0}: {1}", reader.Name, reader.ReadElementContentAsString());
            }
        }
    }

    Read();
}

打印出它看起来确实看到的NodeType值。在这里,我打印我们按顺序找到的类型(减去上面的if语句):

No spaces around <B>.      Spaces added around <B>.
     Index: Element         Index: Element
         A: Element             A: Element
          : Text                 : Text
         A: EndElement          A: EndElement
         B: Element              : Whitespace
         C: Element             B: Element
          : Text                 : Whitespace
         C: EndElement          C: Element
     Index: EndElement           : Text
                                C: EndElement
                            Index: EndElement

问题似乎与声明有关:

reader.ReadElementContentAsString()

如果我删除该声明,我会再次出现B。我认为这可能与将reader移动到下一个节点(?)的方法有关,但我似乎无法证明这一点,或者解决它。

我应该如何处理XmlReader的空节点?

1 个答案:

答案 0 :(得分:0)

在您的代码中,ReadElementContentAsString使读者超过</A>的末尾,以便它位于版本中的空元素<B />,而不包含空格和文本节点{{ 1}}在带空格的版本中。控制进行到循环的reader.Read()语句表达式,这使得读者超越它,有效地跳过它。因此,如果在正文中调用while,则需要修改逻辑,以便在循环的头部不调用reader.Read()