【发布时间】:2017-02-08 10:11:55
【问题描述】:
试图了解XmlReader.Read() 和XmlReader.ReadStartElement() 之间的“不一致”。在reader1下面,一切都在意料之中,即读取整个xml需要3次读取;更重要的是,第一次阅读时,即阅读<firstname>,reader1.Value 是空的。第二读 reader1.Value 是文本节点值。
但是在reader2 中,我期待相同的阅读顺序,因为据我所知ReadStartElement() 内部调用Read(),它应该只读取一个XmlNodeType,例如这里是<firstname>。就好像我们可以用调用来替换 ReadStartElement("firstname") 以检查它是否是名称为 firstname 的开始元素和对 Read() 的调用。为什么 reader2.Value 在 ReadStartElement("firstname") 之后不为空?
我最初在@lesscode 的一个问题下问这个问题,他的解释是,根据msdn,ReadStartElement() 会将XmlReader 推进到下一个节点,reader.Value 是当前节点的值。但如果是这样,Read() 和 ReadStartElement() 之间不是不一致吗,因为使用 Read() 之后必须检索值,而使用 ReadStartElement() 必须事先检索 Value。
var simpleElement = "<firstname>Jim</firstname>";
using (var reader1 = XmlReader.Create(new StringReader(simpleElement)))
{
var i = 1;
while (reader1.Read())
{
WriteLine($"i = {i++}; value = {reader1.Value}");
}
}
using (var reader2 = XmlReader.Create(new StringReader(simpleElement)))
{
// this internally calls Read() which should have ONLY read the 'firstname' start element node.
reader2.ReadStartElement("firstname");
// prints Jim; but why??? The text node has NOT been read yet!
WriteLine(reader2.Value);
reader2.Read(); //WHY needs this line given text node has been read already?
reader2.ReadEndElement();
}
【问题讨论】:
-
发布包含重复标签的 xml 示例。
-
@jdweng 没有xml样本;
Jim 是整个 xml;我只是在测试XmlReader()的工作原理并找到这个“问题”。 -
@JonSkeet 有什么想法吗?
-
在下面的帖子中查看我的解决方案。我使用 xmlreader 和 xml linq 的组合来避免您看到的问题。 stackoverflow.com/questions/34274568/…
标签: c# xml xml-parsing