C# LINQ到XML-从文件加载XML片段

C# LINQ到XML-从文件加载XML片段,c#,xml,linq,C#,Xml,Linq,我有包含多个根元素的源XML文件,对此我无能为力。将这些片段加载到具有单个根节点的XDocument中的最佳方法是什么,我可以创建一个有效的XML文档 样本: <product></product> <product></product> <product></product> 应该是这样的: <products> <product></product> <produc

我有包含多个根元素的源XML文件,对此我无能为力。将这些片段加载到具有单个根节点的XDocument中的最佳方法是什么,我可以创建一个有效的XML文档

样本:

<product></product>
<product></product>
<product></product>

应该是这样的:

<products>
  <product></product>
  <product></product>
  <product></product>
</products>


谢谢

大概是这样的

var newXML= new XElement("products",
               from x in Xdocuments.parse(originalFile).descendants("product")                       
               select new XElement("product",x.value)
            );

我让您将其放入字符串字段,但您基本上可以这样做:

myDoc=new XmlDocument();
myDoc.LoadXml("<products>"+myData+"</products>");
myDoc=newxmldocument();
myDoc.LoadXml(“+myData+”);

下面介绍如何使用
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,这正是我想做的,但我想在正确使用阅读器时遇到了困难:)。这也很好,因为我可以为元素名称添加另一个检查,以过滤掉一些我不需要的元素。@Robert Rossney:为什么要进行“if(xr.NodeType==XmlNodeType.element)”检查?
Read
方法可以返回很多非元素的内容—CDATA节、处理指令、注释、XML声明,实体引用等。上述代码将跳过注释(例如),而不是将其添加到
XDocument
,这可能不是所需的,但至少它不会引发异常。我不喜欢在没有某种形式的验证(实际上是有效的XML)的情况下,从文件中拉出字符串并将其插入其中。对于快速和肮脏的XML,这实际上是一个很好的记法。当您执行XDocument.Parse(originalFile)时,这仍然会引发异常。事实上,我指的是加载,我确实说过“类似”!:)解析字符串或加载文件都可以:)