【发布时间】: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 处理空节点?
【问题讨论】: