LINQ to XML - 从文件加载 XML 片段
Posted
技术标签:
【中文标题】LINQ to XML - 从文件加载 XML 片段【英文标题】:LINQ to XML - Load XML fragments from file 【发布时间】:2011-01-23 09:13:00 【问题描述】:我有包含多个根元素的源 XML 文件,对此我无能为力。将这些片段加载到具有单个根节点的 XDocument 中的最佳方法是什么,我可以创建该根节点以获得有效的 XML 文档?
示例:
<product></product>
<product></product>
<product></product>
应该是这样的:
<products>
<product></product>
<product></product>
<product></product>
</products>
谢谢!
【问题讨论】:
【参考方案1】:以下是使用XmlReader
的方法,这可能是最灵活且执行速度最快的方法:
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.ConformanceLevel = ConformanceLevel.Fragment;
XDocument doc = new XDocument(new XElement("root"));
XElement root = doc.Descendants().First();
using (StreamReader fs = new StreamReader("XmlFile1.xml"))
using (XmlReader xr = XmlReader.Create(fs, xrs))
while(xr.Read())
if (xr.NodeType == XmlNodeType.Element)
root.Add(XElement.Load(xr.ReadSubtree()));
【讨论】:
谢谢罗伯特,这正是我想要做的,但我猜想正确使用阅读器时遇到了麻烦:)。这也很棒,因为我可以为元素名称添加另一个检查,以过滤掉一些我不需要的元素。 @Robert Rossney:为什么要检查“if (xr.NodeType == XmlNodeType.Element)”?Read
方法可以返回许多不是元素的东西——CDATA 部分、处理指令、cmets、XML 声明、实体引用等。上面的代码将跳过 cmets(例如)而不是将它们添加到XDocument
,这可能不是我们想要的,但至少它不会抛出异常。【参考方案2】:
我会让你把它放到一个字符串字段中,但你基本上可以这样做:
myDoc=new XmlDocument();
myDoc.LoadXml("<products>"+myData+"</products>");
【讨论】:
我不喜欢必须从文件中提取字符串,然后将其放入其中而无需某种形式的验证,即实际上是有效的 XML。 快速而肮脏,这实际上是一个好记的技巧【参考方案3】:大概是这样的。
var newXML= new XElement("products",
from x in Xdocuments.parse(originalFile).descendants("product")
select new XElement("product",x.value)
);
【讨论】:
当你执行 XDocument.Parse(originalFile) 时这仍然会抛出异常 确实,我的意思是加载,我确实说过“类似”! :) 你解析一个字符串或者你加载一个文件都很好:)以上是关于LINQ to XML - 从文件加载 XML 片段的主要内容,如果未能解决你的问题,请参考以下文章
如何/我可以使用 linq to xml 以合理的内存消耗查询巨大的 xml 文件?
Linq to XML 从 config.xml 选择节点(Lambda 表达式或经典查询)