【问题标题】:XmlReader sensative about whitespace between elements [duplicate]XmlReader对元素之间的空白敏感[重复]
【发布时间】:2018-03-13 01:21:52
【问题描述】:

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 处理空节点?

【问题讨论】:

标签: c# .net xml xmlreader


【解决方案1】:

在您的代码中,ReadElementContentAsString 将阅读器推进到 &lt;/A&gt; 的末尾,使其定位在不带空格的版本中的空元素 &lt;B /&gt; 和带空格的版本中的文本节点 .控制继续到while 循环头部中的reader.Read() 语句表达式,它使读者超越它,有效地跳过它。所以你需要修改逻辑,如果在循环体中调用ReadElementContentAsString,则不会在循环头部调用reader.Read()

【讨论】: