【问题标题】:Xelement extract xml from different files and combine back to xmlXelement 从不同的文件中提取 xml 并组合回 xml
【发布时间】:2015-12-14 05:27:31
【问题描述】:

我有这个 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>

【问题讨论】:

  • 你的问题不清楚。您想将过滤后的节点添加到另一个 XML 吗?
  • @DenisL 你的代码有什么问题?
  • 我正在浏览数百个包含上述格式的 XML 的文件。 (简化)。一些订单失败了,所以我想从不同的 xml 文件中提取那些 节点(加上下面的所有内容),并使用相同的模式将它们组合成 1 个 XML 文件。

标签: c# xml linq xelement


【解决方案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()
        )
    )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多