Bestimmte Teile einer XML weiterverarbeiten

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bestimmte Teile einer XML weiterverarbeiten

    Hallo,

    ich habe eine .XML mit folgender Struktur (Beispiel):

    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="ISO-8859-1"?>
    2. <A>
    3. <B index="0">
    4. <C>Ein Wert</C>
    5. <D>Ein Wert</D>
    6. <E>Ein weiterer Wert</E>
    7. <S>
    8. <T index="0">
    9. <T1>Viele weitere Werte</T1>
    10. </T>
    11. <T index="1">
    12. <T1>Viele weitere Werte</T1>
    13. </T>
    14. <T index="2">
    15. <T1>Viele weitere Werte</T1>
    16. </T>
    17. <T index="n">
    18. <T1>Viele weitere Werte</T1>
    19. </T>
    20. </S>
    21. <U>
    22. <U1>Wieder ein Wert</U1>
    23. <U2>Wieder ein Wert</U2>
    24. <U3>Wieder ein Wert</U3>
    25. <U4>Wieder ein Wert</U4>
    26. </U>
    27. </B>
    28. <B index="1">
    29. <C>Ein Wert</C>
    30. <D>Ein Wert</D>
    31. <E>Ein weiterer Wert</E>
    32. <S>
    33. <T index="0">
    34. <T1>Viele weitere Werte</T1>
    35. </T>
    36. <T index="1">
    37. <T1>Viele weitere Werte</T1>
    38. </T>
    39. <T index="2">
    40. <T1>Viele weitere Werte</T1>
    41. </T>
    42. <T index="n">
    43. <T1>Viele weitere Werte</T1>
    44. </T>
    45. </S>
    46. <U>
    47. <U1>Wieder ein Wert</U1>
    48. <U2>Wieder ein Wert</U2>
    49. <U3>Wieder ein Wert</U3>
    50. <U4>Wieder ein Wert</U4>
    51. </U>
    52. </B>
    53. <B index="2 ">
    54. <C>Ein Wert</C>
    55. <D>Ein Wert</D>
    56. <E>Ein weiterer Wert</E>
    57. <S>
    58. <T index="0">
    59. <T1>Viele weitere Werte</T1>
    60. </T>
    61. <T index="1">
    62. <T1>Viele weitere Werte</T1>
    63. </T>
    64. <T index="2">
    65. <T1>Viele weitere Werte</T1>
    66. </T>
    67. <T index="n">
    68. <T1>Viele weitere Werte</T1>
    69. </T>
    70. </S>
    71. <U>
    72. <U1>Wieder ein Wert</U1>
    73. <U2>Wieder ein Wert</U2>
    74. <U3>Wieder ein Wert</U3>
    75. <U4>Wieder ein Wert</U4>
    76. </U>
    77. </B>
    78. </A>


    Nun brauch ich zB nur aus jedem <B> 2-3 Werte & nicht alle. Denn das Format der .XML welche oben ist muss geändert werden. Dazu brauche ich nur ca 30% der Werte & muss diese in eine neue Struktur bringen.


    Stehe damit gerade für ner Wand :) Bin über jeden Tipp/jede Hilfe dankbar.

    Schrubbii schrieb:

    & nicht alle
    Es ist nicht sinnvoll, in einer XML-Datei rumzueditieren, da die Zeilenumbrüche nicht unbedingt zum XML-Format gehören.
    Wenn das also eine XML-Datei ist, behandle sie so, lade sie in ein XmlDocument oder ein XDocument ein und lies die erforderlichen Nodes aus.
    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!
    Hey - danke für die schnelle Hilfe.

    Habe mich nun an einem xmlReader. Jedoch finde ich keine Möglichkeit über ein Attribut herauszufinden welcher "Parent" dieses hat? Bisher schauts so aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub processXML(filePath As String)
    2. Dim xmlReader As XmlTextReader = New XmlTextReader(filePath)
    3. Do While (xmlReader.Read())
    4. Select Case xmlReader.NodeType
    5. Case XmlNodeType.Element
    6. If (isUseful(xmlReader.Name)) Then
    7. If xmlReader.HasAttributes Then
    8. While xmlReader.MoveToNextAttribute()
    9. Console.Write(" {0}='{1}'", xmlReader.Name, xmlReader.Value)
    10. End While
    11. End If
    12. Console.WriteLine(">")
    13. End If
    14. Case XmlNodeType.Text
    15. Console.WriteLine(xmlReader.Value)
    16. Case XmlNodeType.EndElement
    17. Console.WriteLine("</" + xmlReader.Name + ">")
    18. End Select
    19. Loop
    20. End Sub


    Habe über "isUseful" die Abfrage basierend auf dem Name gemacht - jedoch wird mir immer "True" zurückgegeben...

    Schrubbii schrieb:

    Habe über "isUseful" die Abfrage basierend auf dem Name gemacht
    mit welchem Code?
    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!
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function isUseful(currentLine As String) As Boolean
    2. If currentLine.Contains("order_id") Or currentLine.Contains("order_main_entry_timestamp") Or currentLine.Contains("customer_id") Or currentLine.Contains("first_name") Or currentLine.Contains("last_name") Or currentLine.Contains("street") Or currentLine.Contains("zip") Or currentLine.Contains("city") Or currentLine.Contains("article_no") Or currentLine.Contains("article_description") Or currentLine.Contains("article_quantity") Then
    3. Console.Write("<" + currentLine)
    4. Return True
    5. Else
    6. Return False
    7. End If
    8. End Function

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Schrubbii“ ()

    Schrubbii schrieb:

    currentLine.Contains
    Das ist ja grottenschlecht.
    Mach Dir eine List(Of String), zu der Du all diese Keys hinzufügst. Dann fragst Du nur noch

    VB.NET-Quellcode

    1. If MyList.Contains(currentLine) Then
    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!