XML nodes 1:1 in neue Datei kopieren

  • VB.NET

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Translating-IT.

    Translating-IT schrieb:


    Was mich jetzt noch wundert: Warum ist die Datei jetzt noch größer als Vorher? Es steht doch viel weniger drin, oder muss ich noch eine Optimierung des XML-Codes laufen lassen?


    Nimm Notepad++ und guck Dir beide Dateien genau an. Vielleicht hat die originale Datei keine Formatierungen oder ist mit Tabulator formatiert und du hast mit Leerzeichen formatiert?
    Sonst prüf noch dein Encoding, UTF8 ist Standard und sollte eigentlich auch reichen.

    docs.microsoft.com/de-de/dotne…ngs?view=netframework-4.8
    docs.microsoft.com/de-de/dotne…ent?view=netframework-4.8

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dksksm“ ()

    RodFromGermany schrieb:

    Mit welchem Code?
    Das würd mich jetzt auch interessieren - wo du scheinbar wieder bei xmlDocument angekommen bist, von dems anfangs hiess, es könne gigabyte-grosse dateien nicht laden.
    Aber bitte wirklich den Code zeigen - nicht nur die eine oder annere schleife ausschneiden.
    am besten immer ganze Methoden posten.
    Wenn sie länger sind als 50 Zeilen ist das meist eh ein Code-Design-Fehler, und Thema eines weiteren Threads.
    Puh, ich habe den Beitrag 16 gar nicht so genau wahrgenommen. Stimmt, da lutscht er sich wieder das ganze XML ins XmlDocument rein. Im Beitrag 13 sah es noch soweit richtig aus.
    Ich kann mich auch nur wiederholen: "Mach Dich erst einmal heran das Gerüst zu bauen, Einleseschleife und in neue Datei ausgeben. Fertig."
    Und dann zeig uns den Code dazu.

    ErfinderDesRades schrieb:

    wo du scheinbar wieder bei xmlDocument angekommen bist
    Nö, ich nutze da eher den XmlReader und XmlWriter, habich bei unserem Makro-Programm im Einsatz.
    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!
    sorry, war gestern am Abend noch sehr stressig geworden mit normalem Büroalltag (programmier nur nebenbei) und hab dann die Datei im Notepad nicht vollständig/schleissig angeschaut. Beim letzten Eintrag gab es kein lod:AUDIO, bei den anderen aber schon. Daher fast kein Unterschied in der Datei bzw. etwas größer, da ich 2 Zeilen hinzugefügt hatte.

    Also, mein Skript hat die Knotenentfernung nicht übernommen …

    xmlreader und xmlwriter lesen und schreiben die riesigen Dateien. XmlDocument habe ich nur drin, um die kleinen Knoten wo reinzuschreiben, kann aber sicher noch durch etwas anderes ersetzt werden. Insgesamt bleibt der Speicherverbrauch derweil unter 100MB.

    Anbei mal den Code bisher:

    VB.NET-Quellcode

    1. Using reader As XmlReader = XmlReader.Create(xmlfile)
    2. Using writer As XmlWriter = XmlWriter.Create(WorkingFile6, settings)
    3. reader.ReadToDescendant("lod:ITEM")
    4. Dim document As XmlDocument = New XmlDocument()
    5. document.Load(xsddatei)
    6. Dim nsmgr = New XmlNamespaceManager(document.NameTable)
    7. nsmgr.AddNamespace("lod", link)
    8. Dim boo_remov As Boolean
    9. writer.WriteStartElement("LOD")
    10. Do
    11. Dim doc As XmlDocument = New XmlDocument()
    12. doc.LoadXml(reader.ReadOuterXml())
    13. For Each node As XmlNode In doc.GetElementsByTagName("lod:ITEM")
    14. If node.Name = "lod:AUDIO" Then
    15. boo_remov = True
    16. node.RemoveChild(node.SelectSingleNode("lod:AUDIO", nsmgr))
    17. End If
    18. If boo_remov = True Then
    19. End If
    20. Next
    21. boo_remov = False
    22. doc.WriteTo(writer)
    23. writer.Flush()
    24. Loop While reader.ReadToNextSibling("lod:ITEM")
    25. writer.WriteEndElement()
    26. End Using
    27. End Using


    Beim Teil mit dem Entfernen, bin ich noch am rumprobieren, der ändert sich gerade ständig ;) Der Code selbst ist aber sicher noch optimierbar.

    Das hier ist der Code für das Entfernen, der solange funktioniert, wie "lod:AUDIO" vorkommt:

    VB.NET-Quellcode

    1. For Each node As XmlNode In doc.GetElementsByTagName("lod:ITEM")
    2. node.RemoveChild(node.SelectSingleNode("lod:AUDIO", nsmgr))
    3. Next


    Ich versuche also gerade, dem Programm mitzuteilen, dass er nur den Knoten entfernen soll, wenn er im eingelesenen Hauptknoten auch vorkommt und sitz scheinbar voll auf der Leitung.

    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Translating-IT“ ()

    Deinen Code verstehe ich nicht ganz, wozu brauchst Du die Zeilen 6 bis 10?
    So müsste es doch eigentlich gehen, oder nicht?
    Leider kann ich ohne eine eine kleine Test-XML auch nicht testen.

    VB.NET-Quellcode

    1. Using reader As XmlReader = XmlReader.Create(xmlfile)
    2. Using writer As XmlWriter = XmlWriter.Create(WorkingFile6, settings)
    3. reader.ReadToDescendant("lod:ITEM")
    4. writer.WriteStartElement("LOD")
    5. Do
    6. Dim doc As XmlDocument = New XmlDocument()
    7. doc.LoadXml(reader.ReadOuterXml())
    8. Dim xnList As XmlNodeList = doc.SelectNodes("lod:AUDIO")
    9. For Each el As XmlNode In xnList
    10. el.ParentNode.RemoveChild(el)
    11. Next
    12. doc.WriteTo(writer)
    13. writer.Flush()
    14. Loop While reader.ReadToNextSibling("lod:ITEM")
    15. End Using
    16. End Using

    Die brauche ich als Namespace-Definition, sonst hat er Probleme mit dem Präfix "lod:". Das hatte ich weiter oben schon beschrieben.

    Nein, funktioniert leider nicht, da lässt er alles stehen. :( Am nächsten bin ich noch mit meiner Lösung oben gekommen (die 3 letzten Zeilen Code am Ende), aber die funktioniert eben nur, wenn überall ein "lod:AUDIO" vorkommt.
    Ich muss also irgendwie noch einen Filter dafür einbauen.
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.
    ich hab's geschafft: 8o

    VB.NET-Quellcode

    1. If node.SelectSingleNode("lod:AUDIO", nsmgr) IsNot Nothing Then
    2. node.RemoveChild(node.SelectSingleNode("lod:AUDIO", nsmgr))
    3. End If


    und die Datei hat nur mehr 115 MB.

    Nochmal vielen Dank für die Hilfe. :thumbsup:
    :!: Leider hab ich nicht immer Zeit zum Programmieren, da es eher ein Hobby ist. Falls ich mal im Forum ne Frage stelle und länger nicht antworte, nicht böse sein: Ich bin dann entweder beruflich oder mit der Familie zu sehr eingespannt oder einfach zu müde. Das kann erfahrungsgemäß auch mal über Wochen dauern, aber ich melde mich immer und setze die Frage ggf. auf beantwortet.