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简介

C# linq to Xml(复习用)

如何/我可以使用 linq to xml 以合理的内存消耗查询巨大的 xml 文件?

Linq to XML 从 config.xml 选择节点(Lambda 表达式或经典查询)

使用 linq to xml 从 xml 文档中删除 xmlns="something"

Linq to XML:从查询到变量