gpt4 book ai didi

c# - 为什么 XmlReader 会跳过元素?

转载 作者:太空狗 更新时间:2023-10-30 01:01:46 26 4
gpt4 key购买 nike

请注意,此问题特定于 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

非常感谢任何帮助。

最佳答案

问题是,如果中间没有空格,对 XNode.ReadFrom() 的调用将使 XML 阅读器定位在下一个元素的右边。 while 条件然后在我们可以检查它之前立即消耗这个元素。解决方法是不在之后立即调用 XmlReader.Read(),而是继续检查节点(因为读取已隐式完成):

while (reader.Read()) {
while (reader.NodeType == XmlNodeType.Element
&& reader.Name.Equals(elementName, StringComparison.InvariantCulture)) {
yield return XNode.ReadFrom(reader) as XElement;
}
}

(如果不清楚,循环中的 if 已更改为 while。)

关于c# - 为什么 XmlReader 会跳过元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36909789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com