雖然試圖儘量減少XML解析程序的內存佔用,特別是避免使用XElement.Load()
加載數百兆字節,但是我遇到了使用較舊的XmlReader
e.g. here的文章。XmlReader跳過相鄰元素
我需要在內部重建每個主要元素爲XElement
以避免重大重構。但是,我發現如果我的源元素直接相鄰,則此方法會跳過每個第2個元素。
我拆掉了問題該單元測試(MSTest2與FluentAssertions):
[DataTestMethod]
[DataRow("<data><entry>1</entry><entry>2</entry><entry>3</entry><entry>4</entry></data>")]
[DataRow("<data><entry>1</entry> <entry>2</entry> <entry>3</entry> <entry>4</entry></data>")]
public void XmlReaderCount(string input)
{
var sr = new StringReader(input);
var xml = XmlReader.Create(sr);
xml.MoveToContent();
var data = new List<string>();
while (xml.Read())
{
if (xml.LocalName == "entry" && xml.NodeType == XmlNodeType.Element)
{
var element = (XElement)System.Xml.Linq.XNode.ReadFrom(xml);
data.Add(element.Value);
}
}
data.Should()
.HaveCount(4);
}
第一(數據驅動的)測試失敗:
預計集合包含4個項目,但找到了2.
因爲它將1和3放入數據收集中。它循環4次,但每個其他元素都有xml.NodeType
的Text
,而不是Element
。通過處理所有4
在我的現實世界的例子第二次測試(與</entry>
和<entry>
通過之間的空間,我不能輕易改變的源泉。我已經有一個解決方案,通過another StackOverflow question啓發,所以我可以做下面,但它似乎很奇怪 - 一些錯誤
[DataTestMethod]
[DataRow("<data><entry>1</entry><entry>2</entry><entry>3</entry><entry>4</entry></data>")]
[DataRow("<data><entry>1</entry> <entry>2</entry> <entry>3</entry> <entry>4</entry></data>")]
public void XmlReaderCountSubtree(string input)
{
var data = new List<string>();
var sr = new StringReader(input);
var xml = XmlReader.Create(sr);
xml.MoveToContent();
while (xml.Read())
{
if (xml.LocalName == "entry" && xml.NodeType == XmlNodeType.Element)
{
using (var subtree = xml.ReadSubtree())
{
subtree.MoveToContent();
var content = subtree.ReadOuterXml();
var element = XElement.Parse(content);
data.Add(element.Value);
}
}
}
data.Should()
.HaveCount(4);
}
啊,疑難雜症。因此,在if條件中,我會調用'continue',否則(不需要else)我會執行'xml.Read()'來執行類似於你的操作。 –