2017-11-02 1 views
-2

Ich habe eine XML-Datei, die wie folgt aussieht:Challenge-Umstrukturierung XML

<SalesOrders> 
    <Header> 
     <CustomerID>456554</CustomerID> 
     <BuyerID>312</BuyerID> 
     <OrderNbr>S392392</OrderNbr> 
    </Header> 
    <Item> 
     <Item>E565-14</Item> 
     <Quantity>65</Quantity> 
     <Price>33.45</Price> 
    </Item> 
    <Item> 
     <Item>G916-22</Item> 
     <Quantity>654</Quantity> 
     <Price>655.22</Price> 
    </Item> 
    <Header> 
     <CustomerID>156557</CustomerID> 
     <BuyerID>35</BuyerID> 
     <OrderNbr>S394545</OrderNbr> 
    </Header> 
    <Item> 
     <Item>GS654-88</Item> 
     <Quantity>78</Quantity> 
     <Price>2.11</Price> 
    </Item> 
</SalesOrders> 

ich so will umstrukturieren meine XML, dass ich die Header-& (r) Artikel innerhalb Bestell Knoten wie dieses:

<SalesOrders> 
    <Order> 
     <Header> 
      <CustomerID>456554</CustomerID> 
      <BuyerID>312</BuyerID> 
      <OrderNbr>S392392</OrderNbr> 
     </Header> 
     <Item> 
      <Item>E565-14</Item> 
      <Quantity>65</Quantity> 
      <Price>33.45</Price> 
     </Item> 
     <Item> 
      <Item>G916-22</Item> 
      <Quantity>654</Quantity> 
      <Price>655.22</Price> 
     </Item> 
    </Order> 
    <Order> 
     <Header> 
      <CustomerID>156557</CustomerID> 
      <BuyerID>35</BuyerID> 
      <OrderNbr>S394545</OrderNbr> 
     </Header> 
     <Item> 
      <Item>GS654-88</Item> 
      <Quantity>78</Quantity> 
      <Price>2.11</Price> 
     </Item> 
    </Order> 
</SalesOrders> 

Ich bin vertraut mit C# und kenne auch einige LINQ. Ich kann nicht das richtige Beispiel dafür finden, wie ich dies aus den Online-Beispielen, nach denen ich gesucht habe, machen kann.
Gibt es jemanden, der ein Beispiel wie dies erreicht werden kann?

Danke

ich ohne den Code zu entschuldigen. Dieser Code kombiniert tatsächlich viele einzelne XML-Dateien in einer XML-Datei. Mein ursprünglicher Plan war, die Order-Knoten in den XML-Code einzufügen, nachdem die endgültige XML-Ausgabedatei erstellt wurde. Vielleicht ist das nicht die beste Methode dafür? Ich bin offen für alle Vorschläge. Hier ist der Code:

public void CombineXMLFiles() 
{ 
    string[] XMLFiles = null; 
    XmlDocument CombineXMLDoc = new XmlDocument(); 
    CombineXMLDoc.LoadXml("<SalesOrders></SalesOrders>"); 
    XMLFiles = Directory.GetFiles("e:\\data\\xml\\", "529485*.xml"); 
    foreach (void FileName_loopVariable in XMLFiles) { 
     FileName = FileName_loopVariable; 
     FileInfo FileInfo = new FileInfo(FileName); 
     if (FileInfo.Length <= 0) { 
      File.Delete(FileName); 
      continue; 
     } 
     XmlDocument OrderXMLDoc = new XmlDocument(); 
     OrderXMLDoc.Load(FileName); 
     foreach (XmlNode Node in OrderXMLDoc.DocumentElement.ChildNodes) { 
      switch (Node.Name.ToUpper) { 
       case "HEADER": 
        XmlNode OrderNode = CombineXMLDoc.ImportNode(Node, true); 
        CombineXMLDoc.DocumentElement.AppendChild(OrderNode); 
        break; 
       case "ITEM": 
        XmlNode OrderNode = CombineXMLDoc.ImportNode(Node, true); 
        CombineXMLDoc.DocumentElement.AppendChild(OrderNode); 
        break; 
       default: 
        continue; 
      } 
     } 
    } 
    string dtStamp = DateTime.Now.ToString("yyyyMMddHHmmss"); 
    CombineXMLFileName = "e:\\data\\xml\\output\\" + "STC_" + dtStamp + ".XML"; 
    CombineXMLDoc.Save(CombineXMLFileName); 
} 
+0

Können Sie Ihren aktuellen Code zeigen, dass Sie Hilfe benötigen? – xxbbcc

+2

Alles, was gepostet wurde, ist eine Programmbeschreibung. Allerdings müssen Sie [eine Frage stellen] (// stackoverflow.com/help/how-to-ask). Wir können nicht sicher sein, was Sie von uns wollen. Bitte [bearbeiten] Sie Ihren Beitrag, um eine gültige Frage zu enthalten, die wir beantworten können. Erinnerung: stellen Sie sicher, dass Sie wissen, was hier zu tun ist (// stackoverflow.com/help/on-topic), und bitten Sie uns, das Programm für Sie zu schreiben, und Vorschläge sind nicht Thema. – gunr2171

+0

Der Code, den ich habe, nimmt viele einzelne XML-Dateien und hängt sie an eine einzige XML-Ausgabedatei an. – user3613998

Antwort

0

Diese Linq to XML-Code permutiert Ihre erste XML-Probe in die zweite. Wenn Sie den ersten XML-Code aus mehreren Dateien zusammensetzen müssen, ist es möglicherweise komplizierter, xdoc zusammen zu bekommen.

Sie können diese Logik in eine foreach-Schleife trivial übersetzen. Es ist überhaupt nicht schwierig, was Sie tun möchten.

var xdoc = XDocument.Parse(xml); 

var headersWithItems = 
    xdoc.Descendants("Header") 
    .Select(h => new { 
     Header = h, 
     Items = h.ElementsAfterSelf().TakeWhile(e => e.Name == "Item") }) 
    ; 

var salesOrders = 
    new XElement("SalesOrders", 
     headersWithItems.Select(
       hwi => 
       { 
        var e = new XElement("Order", hwi.Header); 
        e.Add(hwi.Items.ToArray()); 
        return e; 
       } 
      ).ToArray() 
     ); 
+0

Danke Ed. Dieser Linq-Code hat es geschafft! Ich konnte die salesOrders-Variable in ein neues XML-Ausgabedokument ausgeben. Ich halte mich immer noch für einen Anfänger mit Linq. – user3613998

0

Ich würde etwas anders mit XML LINQ getan. Nur ein Stilunterschied

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      XElement salesOrder = doc.Descendants("SalesOrders").FirstOrDefault(); 
      List<XElement> children = salesOrder.Elements().ToList(); 

      XElement order = null; 
      foreach (XElement child in children) 
      { 
       if (child.Name.LocalName == "Header") 
       { 
        order = new XElement("Order"); 
        salesOrder.Add(order); 

       } 
       order.Add(child); 
       child.Remove(); 
      } 
     } 
    } 
}