2015-12-14 2 views
1

У меня этот XML. Я хочу сначала найти/извлечь первый по порядку-no = «00070853» на C# и позже объединить с тем же 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

You queestion is_not clear_. Вы хотите добавить отфильтрованный узел в другой XML? –

+0

@DenisL В чем проблема с вашим кодом? – har07

+0

Я просматриваю сотни файлов, содержащих XML в формате выше. (Упрощенный). Некоторые из заказов не удались, поэтому я хочу извлечь эти узлы (плюс все ниже) из разных xml-файлов и объединить их в один 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() 
     ) 
    ) 
);