【发布时间】:2017-07-26 15:36:13
【问题描述】:
我有一个非常大的 XML 文件 (> 100MB),我只想通过 Linq to XML 查看其中的一些小元素。
我知道有很多方法可以做到这一点,但我想把它保存在内存中,以便在我的程序中的不同地方使用,所以,我想做的是用 @987654321 遍历这个文档一次@ 并创建我自己的 XDocument 变量,其中仅包含我需要查看的那些元素,但我不确定如何正确执行此操作。
以下是我目前掌握的基本代码:
XDocument parsedXml = new XDocument();
using (var rdr = new XmlTextReader(fileName))
{
rdr.MoveToContent();
rdr.Read();
while (rdr.NodeType == XmlNodeType.Element)
{
switch (rdr.Name)
{
case "Node1":
case "Node2":
case "Node3":
XElement newNode = XElement.Load(rdr.ReadSubtree());
parsedXml.Add(newNode);
rdr.Read();
break;
default:
rdr.Skip();
break;
}
}
rdr.Close();
}
它适用于我添加的第一个元素,但是当我尝试添加任何其他节点时出现错误 - This operation would create an incorrectly structured document。
最好的方法是什么?
谢谢!!
【问题讨论】:
-
如果您的结果是一个新的 Xml/XDocument,我会选择 Xslt,但这只是个人喜好,可能会稍微提高性能。
-
问题,@Filburt,然后我将整个文档加载到内存中。此方法通过
XMLReader对其进行流式传输,并且仅将相关节点拉入内存,因此不会耗尽资源。 -
Xslt 也可以作用于 StreamReader,我不希望它消耗比 XmlTextReader 更多的资源。
-
@Filburt,我不确定我是否理解 - 我需要我的最终值是一个 XDocument,你是说你可以使用不会增加 XMLReader 内存消耗的 XSLT 创建它?你能告诉我怎么做吗? - 我一直认为 XSLT 加载在 DOM 中。
标签: c# xml linq linq-to-xml