【问题标题】:LINQ to XML - Load XML fragments from fileLINQ to XML - 从文件加载 XML 片段
【发布时间】:2011-01-23 09:13:00
【问题描述】:

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

示例:

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

应该是这样的:

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

谢谢!

【问题讨论】:

    标签: c# xml linq


    【解决方案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) 时这仍然会抛出异常
    • 确实,我的意思是加载,我确实说过“类似”! :) 你解析一个字符串或者你加载一个文件都很好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    相关资源
    最近更新 更多