2010-03-03 60 views
13

我有多个根元素的源XML文件,并且我无能为力。将这些片段加载到具有单个根节点的XDocument的最佳方法是什么?我可以创建这些节点以获得有效的XML文档?LINQ to XML - 从文件加载XML片段

样品:

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

应该是这样的:

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

谢谢!

回答

18

以下是如何与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()));     
     } 
    } 
} 
+0

谢谢罗伯特,这正是我想要做的,但有困难正确使用阅读器我猜:)。 这也很好,因为我可以添加另一个元素名称检查来筛选出一些我不需要的元素。 – 2010-03-04 16:54:35

+0

@Robert Rossney:为什么“if(xr.NodeType == XmlNodeType.Element)”检查? – 2010-04-28 18:05:58

+1

'Read'方法可以返回很多不是元素的东西--CDATA节,处理指令,注释,XML声明,实体引用等等。上面的代码将跳过注释(例如)而不是将它们添加到' XDocument',这可能不是我们想要的,但至少它不会抛出异常。 – 2010-04-28 18:32:32

-5

粗略的,类似的。

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

这仍然会抛出一个异常,当你做XDocument.Parse(originalFile) – 2010-03-04 16:56:18

+0

的确,我的意思负载,我是说“像”! :)你解析一个字符串或你加载一个文件都很好:) – 2010-03-05 00:16:33

+0

加载()不会工作。你试过这个吗? – 2010-04-28 18:00:19

8

我将离开你把它变成一个字符串字段,但你基本上可以做到这一点:

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

我不喜欢不得不从文件中拉出字符串,而只是将其放在那里,而没有某种形式的验证,它实际上是有效的XML。 – 2010-03-04 16:55:53

+0

对于一个快速和肮脏的,这实际上是一个很好的记住 – 2010-04-28 18:01:10