xml-File lesen

  • VB.NET
  • .NET (FX) 1.0–2.0

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    xml-File lesen

    Yo Leute,

    ich hab irgendwie Schwierigkeiten folgende XML einzulesen:
    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0"?>
    2. <ns0:Aviso xmlns:ns0="http://XXX">
    3. <ns1:Header xmlns:ns1="http://XXX">
    4. <ns1:DebitorPayer>00123456789</ns1:DebitorPayer>
    5. <ns1:Customer>Firma HandelsgmbH</ns1:Customer>
    6. <ns1:CreationDate>2014-07-10T06:48:50</ns1:CreationDate>
    7. <ns1:ShipmentDate>2014-07-10T06:48:39</ns1:ShipmentDate>
    8. <ns1:ITContactName />
    9. <ns1:ITContactTelephoneNr />
    10. <ns1:ITContactMail />
    11. </ns1:Header>
    12. <ns2:Shipper xmlns:ns2="http://XXX">
    13. <ns2:ShipperName1>Firma HandelsgmbH</ns2:ShipperName1>
    14. <ns2:ShipperCountry>AT</ns2:ShipperCountry>
    15. <ns2:ShipperPostalCode>4000</ns2:ShipperPostalCode>
    16. <ns2:ShipperCity>Stadtname</ns2:ShipperCity>
    17. <ns2:ShipperStreet>Strasse</ns2:ShipperStreet>
    18. <ns2:ShipperStreetNr>1</ns2:ShipperStreetNr>
    19. <ns2:Shipment>
    20. <ns2:ShipmentNr>12345678912345678912</ns2:ShipmentNr>
    21. <ns2:ConsigneeName1>Peter Tester</ns2:ConsigneeName1>
    22. <ns2:ConsigneeCountry>AT</ns2:ConsigneeCountry>
    23. <ns2:ConsigneePostalCode>4020</ns2:ConsigneePostalCode>
    24. <ns2:ConsigneeCity>Linz</ns2:ConsigneeCity>
    25. <ns2:ConsigneeStreet>Hauptplatz </ns2:ConsigneeStreet>
    26. <ns2:ConsigneeStreetNr>1</ns2:ConsigneeStreetNr>
    27. <ns2:ShpRefNr>123 / 12345</ns2:ShpRefNr>
    28. <ns2:Parcel>
    29. <ns2:IdentCode>9876543210987654321098</ns2:IdentCode>
    30. <ns2:ParcelType>C</ns2:ParcelType>
    31. </ns2:Parcel>
    32. <ns2:Product>
    33. <ns2:ProductCode>10</ns2:ProductCode>
    34. <ns2:Feature>
    35. <ns2:FeatureCode>004</ns2:FeatureCode>
    36. </ns2:Feature>
    37. </ns2:Product>
    38. </ns2:Shipment>
    39. <ns2:Shipment>
    40. <ns2:ShipmentNr>11223344556677889900</ns2:ShipmentNr>
    41. <ns2:ConsigneeName1>Mario Tester</ns2:ConsigneeName1>
    42. <ns2:ConsigneeCountry>AT</ns2:ConsigneeCountry>
    43. <ns2:ConsigneePostalCode>4040</ns2:ConsigneePostalCode>
    44. <ns2:ConsigneeCity>Linz</ns2:ConsigneeCity>
    45. <ns2:ConsigneeStreet>Hauptplatz </ns2:ConsigneeStreet>
    46. <ns2:ConsigneeStreetNr>2</ns2:ConsigneeStreetNr>
    47. <ns2:ShpRefNr>999/ 112233</ns2:ShpRefNr>
    48. <ns2:Parcel>
    49. <ns2:IdentCode>9999888877776666555544</ns2:IdentCode>
    50. <ns2:ParcelType>C</ns2:ParcelType>
    51. </ns2:Parcel>
    52. <ns2:Product>
    53. <ns2:ProductCode>10</ns2:ProductCode>
    54. <ns2:Feature>
    55. <ns2:FeatureCode>001</ns2:FeatureCode>
    56. </ns2:Feature>
    57. </ns2:Product>
    58. </ns2:Shipment>
    59. </ns2:Shipper>
    60. </ns0:Aviso>


    Ich benötige daraus generell nur die Daten aus den Knoten Shipment. Also alle Shipment "Inhalte".
    Dafür werde ich mir eine eigene Klasse basteln welche die Daten aufnimmt und die einzelnen Shipments in eine Liste packt.

    Ich bekomme es jedoch nicht gebacken die xml auszulesen. Versucht hab ich es bereits :
    - mit dem XML-Reader: Der geht ja so ein File Zeilenweise durch, jedoch sind zB die Daten "<ns2:ShipmentNr>11223344556677889900</ns2:ShipmentNr>" in mehreren "Zeilen" unterteilt was total dämlich ist mMn. Also <ns2:Shipment> -> eigene Zeile; 11223344556677889900 -> eigene Zeile usw. Find ich total blöd um die Daten korrekt einzulesen (was zB wenn kein Inhalt vorhanden?)
    - in ein DataSet einlesen: Hierbei dir einzelnen Tabellen durchlaufen und bei Tabelle "Shipment" die Rows + Columns auslesen. Funktioniert, ausser dass die Knoten <ns2:Parcel> nicht gefunden werden, da diese als eigene Tabelle fungiert und ich so die Zeilen nicht korrekt lesen kann.

    Hat hier wer einen Tip für mich wie man das Ganze (die einzelnen Shipment-Knoten) korrekt auslesen kann?
    Das sollte wenn möglich mit FW 2.0 machbar sein.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    fichz schrieb:

    in mehreren "Zeilen" unterteilt was
    Ist das das, was ich Siblings nenne?
    ==> NextSibling
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielleicht hilft dir das weiter:

    C#-Quellcode

    1. using System.Xml.Linq;
    2. XDocument xDoc = XDocument.Parse("dein xml");
    3. XNamespace ns0 = "http://XXX";
    4. XNamespace ns2 = "http://XXX";
    5. foreach (XElement item in xDoc.Element(ns0 + "Aviso").Element(ns2 + "Shipper").Elements(ns2 + "Shipment"))
    6. {
    7. System.Diagnostic.Debug.WriteLine(item.Element(ns2 + "ShipmentNr").Value);
    8. }
    Habe nun meinen Fehler gefunden und es ist mir... peinlich...
    @slice
    Diese Methode wollte ich primär machen (ist zwar FW3.5, aber dann muss ich das halt in eine dll auslagern).
    In VB kann man das ja noch viel toller angeben:

    VB.NET-Quellcode

    1. For Each item As XElement In xd.<ns0:Aviso>.<ns2:Shipper>.<ns2:Shipment>
    2. For Each item2 In item.Elements
    3. If item2.HasElements Then
    4. For Each item3 In item2.Elements
    5. Console.WriteLine(" " & item3.Name.LocalName & " | " & item3.Value)
    6. Next
    7. Else
    8. Console.WriteLine(item2.Name.LocalName & " | " & item2.Value)
    9. End If
    10. Next
    11. Next


    Das Problem was ich hatte, waren die komischen xml Namespaces ns0, ns1 und ns2. For Each item As XElement In xd.<ns0:Aviso>.<ns2:Shipper>.<ns2:Shipment> kamen keine Ergebnisse mehr zurück. bei For Each item As XElement In xd.<ns0:Aviso> jedoch sehr wohl.

    Der Fehler war, dass die xml Namespaces (hier als h t t p : / / X X X ) (-> Leerzeichen da der Editor sonst einen Hyperlink daraus macht) welche ich per Imports importiert habe fast genau gleich waren. Jedoch nur fast. Ich hatte den ersten als Imports eingetragen (ns0) und diese Zeile kopiert und nur ns0 auf ns1 bzw. ns2 geändert. Somit konnte er natürlich nichts mehr finden.

    Hier das der Code wie es nun funktioniert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports <xmlns:ns0="http://XXX0">
    3. Imports <xmlns:ns1="http://XXX1">
    4. Imports <xmlns:ns2="http://XXX2">
    5. Module Module1
    6. Sub Main()
    7. Dim xd As XDocument = _
    8. <?xml version="1.0"?>
    9. <ns0:Aviso xmlns:ns0="http://XXX0">
    10. <ns1:Header xmlns:ns1="http://XXX1">
    11. <ns1:DebitorPayer>00123456789</ns1:DebitorPayer>
    12. <ns1:Customer>Firma HandelsgmbH</ns1:Customer>
    13. <ns1:CreationDate>2014-07-10T06:48:50</ns1:CreationDate>
    14. <ns1:ShipmentDate>2014-07-10T06:48:39</ns1:ShipmentDate>
    15. <ns1:ITContactName />
    16. <ns1:ITContactTelephoneNr />
    17. <ns1:ITContactMail />
    18. </ns1:Header>
    19. <ns2:Shipper xmlns:ns2="http://XXX2">
    20. <ns2:ShipperName1>Firma HandelsgmbH</ns2:ShipperName1>
    21. <ns2:ShipperCountry>AT</ns2:ShipperCountry>
    22. <ns2:ShipperPostalCode>4000</ns2:ShipperPostalCode>
    23. <ns2:ShipperCity>Stadtname</ns2:ShipperCity>
    24. <ns2:ShipperStreet>Strasse</ns2:ShipperStreet>
    25. <ns2:ShipperStreetNr>1</ns2:ShipperStreetNr>
    26. <ns2:Shipment>
    27. <ns2:ShipmentNr>12345678912345678912</ns2:ShipmentNr>
    28. <ns2:ConsigneeName1>Peter Tester</ns2:ConsigneeName1>
    29. <ns2:ConsigneeCountry>AT</ns2:ConsigneeCountry>
    30. <ns2:ConsigneePostalCode>4020</ns2:ConsigneePostalCode>
    31. <ns2:ConsigneeCity>Linz</ns2:ConsigneeCity>
    32. <ns2:ConsigneeStreet>Hauptplatz </ns2:ConsigneeStreet>
    33. <ns2:ConsigneeStreetNr>1</ns2:ConsigneeStreetNr>
    34. <ns2:ShpRefNr>123 / 12345</ns2:ShpRefNr>
    35. <ns2:Parcel>
    36. <ns2:IdentCode>9876543210987654321098</ns2:IdentCode>
    37. <ns2:ParcelType>C</ns2:ParcelType>
    38. </ns2:Parcel>
    39. <ns2:Product>
    40. <ns2:ProductCode>10</ns2:ProductCode>
    41. <ns2:Feature>
    42. <ns2:FeatureCode>004</ns2:FeatureCode>
    43. </ns2:Feature>
    44. </ns2:Product>
    45. </ns2:Shipment>
    46. <ns2:Shipment>
    47. <ns2:ShipmentNr>11223344556677889900</ns2:ShipmentNr>
    48. <ns2:ConsigneeName1>Mario Tester</ns2:ConsigneeName1>
    49. <ns2:ConsigneeCountry>AT</ns2:ConsigneeCountry>
    50. <ns2:ConsigneePostalCode>4040</ns2:ConsigneePostalCode>
    51. <ns2:ConsigneeCity>Linz</ns2:ConsigneeCity>
    52. <ns2:ConsigneeStreet>Hauptplatz </ns2:ConsigneeStreet>
    53. <ns2:ConsigneeStreetNr>2</ns2:ConsigneeStreetNr>
    54. <ns2:ShpRefNr>999/ 112233</ns2:ShpRefNr>
    55. <ns2:Parcel>
    56. <ns2:IdentCode>9999888877776666555544</ns2:IdentCode>
    57. <ns2:ParcelType>C</ns2:ParcelType>
    58. </ns2:Parcel>
    59. <ns2:Product>
    60. <ns2:ProductCode>10</ns2:ProductCode>
    61. <ns2:Feature>
    62. <ns2:FeatureCode>001</ns2:FeatureCode>
    63. </ns2:Feature>
    64. </ns2:Product>
    65. </ns2:Shipment>
    66. </ns2:Shipper>
    67. </ns0:Aviso>
    68. Console.WriteLine("Deklaration: {0}", xd.Declaration.ToString())
    69. For Each item As XElement In xd.<ns0:Aviso>.<ns2:Shipper>.<ns2:Shipment>
    70. For Each item2 In item.Elements
    71. If item2.HasElements Then
    72. For Each item3 In item2.Elements
    73. Console.WriteLine(" " & item3.Name.LocalName & " | " & item3.Value)
    74. Next
    75. Else
    76. Console.WriteLine(item2.Name.LocalName & " | " & item2.Value)
    77. End If
    78. Next
    79. Next
    80. Console.Read()
    81. End Sub
    82. End Module​


    Das heißt war im Prinzip ein Copy-Paste Fehler.

    Danke trotzdem an alle :thumbup:

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten