2015-12-14 45 views
1

我有這個XML。我想通過C#中的order-no =「00070853」 找到第一個/提取第一個,然後再與其他文件中的同一個xml進行合併,所以它的模式是 。我試過(只是摘錄但知道如何結合將是很好過)Xelement從不同的文件中提取xml並將其合併回到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> 
+0

你queastion是_not clear_。你想添加過濾節點到另一個XML? –

+0

@DenisL你的代碼有什麼問題? – har07

+0

我正在瀏覽上述格式的數百個包含XML的文件。 (簡化的)。一些訂單失敗了,所以我想從不同的xml文件中提取那些節點(加上下面的所有內容),並使用相同的模式將它們組合成1個XML文件。 – DenisL

回答

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() 
     ) 
    ) 
);