【发布时间】:2016-08-22 22:18:52
【问题描述】:
请注意,这个问题是针对XmlReader 而不是使用XDocument 或XmlReader。
我有一个 XML 片段:
private string GetXmlFragment()
{
return @"<bookstore>
<book genre='novel' ISBN='10-861003-324'>
<title>The Handmaid's Tale</title>
<price>19.95</price>
</book>
<book genre='novel' ISBN='1-861001-57-5'>
<title>Pride And Prejudice</title>
<price>24.95</price>
</book>
</bookstore>";
}
我还有一个扩展方法为:
public static IEnumerable<XElement> GetElement(this XmlReader reader, string elementName)
{
reader.MoveToElement();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element
&& reader.Name.Equals(elementName, StringComparison.InvariantCulture))
{
yield return XNode.ReadFrom(reader) as XElement;
}
}
}
然后我尝试通过以下方式获取两个 book 元素:
var xmlReaderSettings = new XmlReaderSettings
{
CheckCharacters = false,
ConformanceLevel = ConformanceLevel.Fragment,
IgnoreComments = true,
IgnoreWhitespace = true,
IgnoreProcessingInstructions = true
};
using (var stringReader = new StringReader(this.GetXmlFragment()))
using (var xmlReader = XmlReader.Create(stringReader, xmlReaderSettings))
{
xmlReader.GetElement("book").Count().ShouldBe(2);
}
但是我只得到第一个元素,调试显示,一旦我得到第一个元素,阅读器就会跳转到第二个book 元素的title。
解决方案灵感来自HERE
非常感谢任何帮助。
【问题讨论】:
-
无法重现。您的方法在我的机器上生成一个包含两个元素的序列。您确定
this.GetXmlFragment()生成您提供的 XML 吗? -
奇怪,我已经更新了问题以包含方法
-
见dotnetfiddle.net/ssrAG1。您的调试是否会以某种方式干扰?
-
可以确认 - 方法按预期工作
-
我忘了包含
XmlReaderSettings我已经更新了问题,设置IgnoreWhitespace=false行为正常,但设置为true会导致跳转。