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