[VB.NET] XML richtig einlesen

INURIA

Temporär Suspendiert
Registriert
16 Juli 2013
Beiträge
99
Hallo, folgendendes Problem, welches mich seit Tagen zur Verzweiflung bringt:

Ich möchte in VB.NET eine XML einlesen (Bestelleingänge) und diese in einer Listview anzeigen lassen - soweit funktioniert dies aus ohne Probleme. Leider schaffe ich es aber nicht, wenn mehrere Artikel in einer Bestellung geordert werden, diese auch anzuzeigen - es wird immer nur der erste Artikel in der Bestellung angezeigt :dozey:

Wie man aber in der XML sehen kann, sind 2 Bestellungen vorhanden mit jeweils 2 Artikeln. Ich habe versucht mit den wildesten For-each konstruktionen das ganze irgendwie hinzubekommen, aber leider ohne Erfolg - entweder wird da eine dauerschleife draus, oder es wird gar nix mehr angezeigt. Ich hoffe ihr könnt mir irgendwie helfen.

Danke schon einmal :beer:


Hier sollte egtl. folgender output herauskommen:

Bestellung 1 - Artikel 1
Bestellung 1 - Artikel 2
Bestellung 2 - Artikel 1
Bestellung 2 - Artikel 2



Hier der Vb-Code und unten die XML, welche normalerweise per API von einem Server geladen wird.

[src=vbnet] Try
xmlDoc.Load("test.xml")

For Each xmlNode As Xml.XmlElement In xmlDoc.SelectNodes("result/orders/order")

Dim status As String = xmlNode.SelectSingleNode("status").InnerText
Dim items As ListViewItem = ListView1.Items.Add(xmlNode.SelectSingleNode("items/item/name").InnerText)
Dim eMail As String = xmlNode.SelectSingleNode("client/email").InnerText
Dim quantity As String = xmlNode.SelectSingleNode("items/item/qty").InnerText
Dim firstName As String = xmlNode.SelectSingleNode("client/first_name").InnerText
Dim lastName As String = xmlNode.SelectSingleNode("client/last_name").InnerText
Dim productName As String = xmlNode.SelectSingleNode("items/item/name").InnerText
Dim total As String = xmlNode.SelectSingleNode("total").InnerText
Dim created As String = xmlNode.SelectSingleNode("created").InnerText
Dim order_no As String = xmlNode.SelectSingleNode("order_no").InnerText

items.SubItems.Add(quantity)
items.SubItems.Add(total)
items.SubItems.Add(firstName + " " + lastName)
items.SubItems.Add(eMail)
items.SubItems.Add(created)
items.SubItems.Add(status)
items.SubItems.Add(order_no)

' editable | shipped | canceled
If Status = "editable" Then
completeOrder(Order_no, eMail, productName, quantity)
End If
Next
Catch ex As Exception
ListBox1.Items.Add(ex.Message)
End Try[/src]

[src=xml]<result>
<success>1</success>
<orders>
<paging>
<total>1234</total>
<page>1</page>
<pages>139</pages>
<per_page>20</per_page>
</paging>
<order>
<order_no>000-000-000</order_no>
<total>50.99</total>
<shipping>0.00</shipping>
<max_shipping_date>2020-08-07</max_shipping_date>
<payment>PAL</payment>
<status>editable</status>
<invoice_no>999999-88888</invoice_no>
<comment_client/>
<comment_merchant/>
<created>2020-08-05 09:48:27</created>
<InLogistics>0</InLogistics>
<client>
<client_id>41019710</client_id>
<gender>Herr</gender>
<first_name>max</first_name>
<last_name>mustertyp</last_name>
<company/>
<street>Muster Straße</street>
<street_no>8</street_no>
<address_add/>
<zip_code>00000</zip_code>
<city>Teststadt</city>
<country>DE</country>
<email>test@email.de</email>
<phone>123-123-123</phone>
</client>
<delivery_address>
<gender>Herr</gender>
<first_name>max</first_name>
<last_name>mustertyp</last_name>
<company/>
<street>Muster Straße</street>
<street_no>8</street_no>
<address_add/>
<zip_code>00000</zip_code>
<city>Teststadt</city>
<country>DE</country>
</delivery_address>
<items>
<item>
<item_id>83969739</item_id>
<product_id>3133287034</product_id>
<variant_id>0</variant_id>
<product_art_no/>
<name>
Bestellung 1 - Artikel 1
</name>
<name_add/>
<qty>2</qty>
<price>1.59</price>
<price_sum>3.18</price_sum>
<tax>1</tax>
<country/>
<city/>
<address/>
<zip_code/>
</item>
<item>
<item_id>83969744</item_id>
<product_id>3133286649</product_id>
<variant_id>0</variant_id>
<product_art_no/>
<name>
Bestellung 1 - Artikel 2
</name>
<name_add/>
<qty>2</qty>
<price>1.69</price>
<price_sum>3.38</price_sum>
<tax>1</tax>
<country/>
<city/>
<address/>
<zip_code/>
</item>
</items>
<coupon/>
</order>
<order>
<order_no>111-222-333</order_no>
<total>99.99</total>
<shipping>0.00</shipping>
<max_shipping_date>2020-08-07</max_shipping_date>
<payment>PAL</payment>
<status>editable</status>
<invoice_no>999999-88888</invoice_no>
<comment_client/>
<comment_merchant/>
<created>2020-08-05 09:48:27</created>
<InLogistics>0</InLogistics>
<client>
<client_id>41019710</client_id>
<gender>Frau</gender>
<first_name>maxi</first_name>
<last_name>musterfrau</last_name>
<company/>
<street>Muster Straße</street>
<street_no>8</street_no>
<address_add/>
<zip_code>00000</zip_code>
<city>Teststadt</city>
<country>DE</country>
<email>test@email.de</email>
<phone>123-123-123</phone>
</client>
<delivery_address>
<gender>Herr</gender>
<first_name>max</first_name>
<last_name>mustertyp</last_name>
<company/>
<street>Muster Straße</street>
<street_no>8</street_no>
<address_add/>
<zip_code>00000</zip_code>
<city>Teststadt</city>
<country>DE</country>
</delivery_address>
<items>
<item>
<item_id>83969739</item_id>
<product_id>3133287034</product_id>
<variant_id>0</variant_id>
<product_art_no/>
<name>
Bestellung 2 - Artikel 1
</name>
<name_add/>
<qty>2</qty>
<price>1.59</price>
<price_sum>3.18</price_sum>
<tax>1</tax>
<country/>
<city/>
<address/>
<zip_code/>
</item>
<item>
<item_id>83969744</item_id>
<product_id>3133286649</product_id>
<variant_id>0</variant_id>
<product_art_no/>
<name>
Bestellung 2 - Artikel 2
</name>
<name_add/>
<qty>2</qty>
<price>1.69</price>
<price_sum>3.38</price_sum>
<tax>1</tax>
<country/>
<city/>
<address/>
<zip_code/>
</item>
</items>
<coupon/>
</order>
</orders>
</result>[/src]
 
Ich kann zwar kein VB.net aber der Hund liegt hier begragen:

Um alle Bestellungen zu finden, rufst du das hier auf:
[src=vbnet]For Each xmlNode As Xml.XmlElement In xmlDoc.SelectNodes("result/orders/order")[/src]
[src=vbnet]Dim items As ListViewItem = ListView1.Items.Add(xmlNode.SelectSingleNode("items/item/name").InnerText)[/src]

Aber "items" iterriert nicht über alle Items/Gegenstände der aktiven Bestellung:

Ungefähr so:
[src=vbnet]For Each xmlItemNode As Xml.XmlElement In xmlDoc.SelectNodes("result/orders/order/items/item")[/src]
bzw.
[src=vbnet]For Each xmlItemNode As Xml.XmlElement In xmlNode.SelectNodes("items/item")[/src]
[src=vbnet]Dim item As ListViewItem = ListView1.Items.Add(xmlItemNode.SelectSingleNode("name").InnerText)[/src]

Edit: items != item (es behandelt ja immer einen Gegenstand, daher die Umbenennung). Und auch, alles darunter mußt du entsrpechend anpassen.

Denke das könnte so passen, testen kann ich das just now nicht.
 
Zuletzt bearbeitet:
Zurück
Oben