Xelement从不同的文件中提取xml并组合回xml

时间:2015-12-14 05:27:32

标签: c# xml linq xelement

我有这个XML。我想通过order-no =" 00070853"找到第一个/提取第一个。 在C#中,稍后将其与来自其他文件的相同xml结合使用 相同的架构。我已经尝试过了(只是提取,但知道如何结合也很好)

      IEnumerable<XElement> orderXml = from el in xdoc.Descendants(ns + "order")
      where (string)el.Attribute(ns + "order-no").Value == badOrder
      select el;

下面是示例xml(它也有我想要的架构)

      <?xml version="1.0" encoding="UTF-8"?>
      <orders xmlns="http://www.bla.com/xml/impex/order/2006-10-31">
<order order-no="00070853">
    <order-date>2015-12-10T21:58:26.000Z</order-date>
    <created-by>storefront</created-by>        
    <taxation>net</taxation>
    <invoice-no>55023028</invoice-no>
    <customer>
        <customer-no>10028489</customer-no>            
    </customer>
    <status>
        <order-status>NEW</order-status>
        <shipping-status>NOT_SHIPPED</shipping-status>
        <confirmation-status>CONFIRMED</confirmation-status>
        <payment-status>NOT_PAID</payment-status>
    </status>        
</order>

<order order-no="10020785">
    <order-date>2015-12-10T21:58:04.000Z</order-date>
    <created-by>storefront</created-by>
    <taxation>net</taxation>
    <invoice-no>12022832</invoice-no>
    <customer>
        <customer-no>10027992</customer-no>
    </customer>
    <status>
        <order-status>NEW</order-status>
        <shipping-status>NOT_SHIPPED</shipping-status>
        <confirmation-status>CONFIRMED</confirmation-status>
        <payment-status>NOT_PAID</payment-status>
    </status>
</order>
     </orders>

1 个答案:

答案 0 :(得分:1)

假设您处理的每个文件都具有相同的确切结构,您只需读入文件并将元素放入新文档即可。您可能希望跟踪从中获取该数据的文件。

var orderNo = "00070853";
var dir = @"c:\path\to\files\";
XNamespace ns = "http://www.bla.com/xml/impex/order/2006-10-31";
XNamespace meta = "urn:file.combiner:meta";
var newDoc = new XDocument(
    new XElement(ns + "orders",
        new XAttribute(XNamespace.Xmlns + "meta", meta),
        from p in Directory.EnumerateFiles(dir, @"*.xml")
        from e in XDocument.Load(p).Descendants(ns + "order")
        where (string)e.Attribute("order-no") == orderNo
        select new XElement(e.Name,
            new XAttribute(meta + "path", p), // lets add the original path as an attribute
            e.Nodes()
        )
    )
);