2016-11-02 5 views
0

Ich habe die folgende XML:Looping durch XElement Artikel

<ArrayOfCustomerOrderExportInfo> 
<CustomerOrderExportInfo> 
<ID>168</ID> 
<CustomerOrderLines> 
<CustomerOrderExportInfo> 
<Amount>1522</Amount> 
</CustomerOrderExportInfo> 
<CustomerOrderExportInfo> 
<Amount>1522</Amount> 
</CustomerOrderExportInfo> 
... 
</CustomerOrderLines> 
</CustomerOrderExportInfo> 
</ArrayOfCustomerOrderExportInfo> 

ich Schleife durch diese wie folgt aus:

using System.Linq 
using System.XML.Linq 

Stream xmlUpload = <file> 

var customerOrders = from co in 
         XElement.Load(xmlUpload).Eelements("CustomerOrderExportInfo") 
select co; 

xmlUpload.Close 
foreach(var orderXML in customerOrders) 
{ 
    int orderID = Convert.ToInt32(orderXML.Element("ID").Value); 

} 

Diese mich ID 168 fein gibt.

Jetzt möchte ich die CustomerOrderExportInfo Elemente in der vorhandenen foreach-Schleife durchlaufen und dann schlägt es fehl.

Ich habe versucht var customerOrderLine = orderXML.Descendants ("CustomerOrderExportInfo") , aber das gibt eine leere Sammlung. Auch verschiedene Art von orderXML.Nodes() aber immer leere Sammlung.

Pointers und Hilfe geschätzt

Mit freundlichen Grüßen

Jeroen

+0

starten: foreach (var orderXML in customerOrders.FirstOrDefault() Nachkommen ("CustomerOrderExportInfo").) – jdweng

+0

nicht genau das, was ich will. Ich mag Schleife mit der forach Schleife mehr wie forach (var line in orderXML.Descendants ... –

+0

Wahrscheinlich der FirstOrDefault hätte mir ein einzelnes Element für meinen nächsten Schritt gegeben. –

Antwort

0

Lustig,

wenn ich versuche, es in einer Variablen legen Sie es nicht:

var test = orderXML.Descendants("CustomerOrderLineExportInfo"); 

, aber ich mag so:

foreach(var orderLine in orderXML.Descendants("CustomerOrderLineExportInfo")) 

{

... 
} 

i kann

Jeroen

0

Sorry für die VB Datensätze Schleife durch ... Der erste Teil der XElement geladen ist. Leider erlaubt C# keine XML-Literale. (Wenn ich ein C# -Programmierer wäre, müsste ich ein VB-Modul haben, nur um XML-Literale zu haben;)

Einige Daten für den Test hinzugefügt.

Dim xe As XElement 
    'to load from a file 
    ' xe = XElement.Load("Your Path Here") 

    ' for testing 
    xe = <ArrayOfCustomerOrderExportInfo> 
      <CustomerOrderExportInfo> 
       <ID>168</ID> 
       <CustomerOrderLines> 
        <CustomerOrderExportInfo> 
         <Amount>1522</Amount> 
        </CustomerOrderExportInfo> 
        <CustomerOrderExportInfo> 
         <Amount>2522</Amount> 
        </CustomerOrderExportInfo> 
       </CustomerOrderLines> 
      </CustomerOrderExportInfo> 
      <!-- for testing --> 
      <CustomerOrderExportInfo> 
       <ID>9999</ID> 
       <CustomerOrderLines> 
        <CustomerOrderExportInfo> 
         <Amount>991</Amount> 
        </CustomerOrderExportInfo> 
        <CustomerOrderExportInfo> 
         <Amount>992</Amount> 
        </CustomerOrderExportInfo> 
       </CustomerOrderLines> 
      </CustomerOrderExportInfo> 
     </ArrayOfCustomerOrderExportInfo> 

Sobald es geladen ist, können Sie eine Menge interessanter Dinge tun. Die erste besteht darin, alle äußeren CustomerOrderExportInfo zu erhalten.

Dim outerCOI As IEnumerable(Of XElement) 
    outerCOI = xe.<CustomerOrderExportInfo> 

Dann könnte man sie anschaut und die innere CustomerOrderExportInfo

Dim innerCOI As IEnumerable(Of XElement) 
    For Each el As XElement In outerCOI 
     innerCOI = el...<CustomerOrderExportInfo> 
    Next 

Schließlich, wenn man nur alle der CustomerOrderExportInfo Sie dies nur tun konnte innerhalb von CustomerOrderExportInfo wollen bekommen. Beachten Sie, wie Sie über die Elemente auf die ID zugreifen können.

innerCOI = xe.<CustomerOrderExportInfo>...<CustomerOrderExportInfo> 

    For Each el As XElement In innerCOI 
     Debug.WriteLine(el.Parent.Parent.<ID>.Value) 
     Debug.WriteLine(el.<Amount>.Value) 
    Next