XML Attribute vergleichen und ggf. löschen?

  • VB.NET

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

    XML Attribute vergleichen und ggf. löschen?

    Hallo Leute,

    ich steh grad auf dem schlauch.
    ich hab folgende XML-Struktur

    XML-Quellcode

    1. <material label="Kunstleder_Narbe_56_S" type="A3S" ids="Sitze.fbx" name="Kunstleder_Narbe_56_S[0]">
    2. <parameter type="string" name="bumpSource" value="none">
    3. </parameter>
    4. </material>


    und das hier

    XML-Quellcode

    1. <material_assignment visible="" material="Lambert_190_255_130" target="PES1492__A__1_A_ST_VISUAL_HECKKLAPPE___________NP_CLEANED.CATProduct:Surface.9">
    2. </material_assignment>


    wie vergleiche ich jetzt das Attribute "Name" aus der ersten Struktur mit dem Attribute "material" aus der zweiten Struktur? Wenn das Attribute "Name" von dem Knoten "<material> nicht mit dem Attribute "material" vom Konten "material_assignment" übereinstimmt, dann soll der komplette Knoten <mateiral> gelöscht werden.

    Die Knoten <material> und <material_assignmet> stehen ziemlich oft im XML.

    hat jemand eine Idee
    Das geht relativ leicht mit den Klassen XMLReader und XMLWriter.

    msdn.microsoft.com/de-de/libra….xmlreader(v=vs.110).aspx
    msdn.microsoft.com/de-de/libra….xmlwriter(v=vs.110).aspx

    //Edit
    Die antwort von @Don_Batisto: ist wohl besser.
    Hab ich zu spät gesehen
    zunächstmal würde ich ja malwieder typisiertes Dataset empfehlen, denn das ist dafür vorgesehen, um von einem Datensatz der einen Tabelle auf einen Datensatz einer anneren Tabelle zu verweisen.

    da könntest du nun die material-Row direkt abrufen vonne material_assignment-Row, und das wäre auch typsicher und erforderte keine String-Konversion (die ja immer riskant sind).
    hier noch der Code, wie ich die Attribute auslese.

    XML-Quellcode

    1. Dim Attributes_Name = From param In xDoc...<material> Select attr = param.Attribute("name") Where attr IsNot Nothing
    2. Dim Attributes_Material = From name In xDoc...<material_assignment> Select attr = name.Attribute("material") Where attr IsNot Nothing


    so hab ich das in einem anderen Programm gemacht. nur musste ich da keine Attribute vergleichen, sondern nur die gewünschten Knoten löschen.

    Ich schau gleich mal, ob ich das so hinbekomme, wie ihr mir das vorgeschlagen habt.

    Danke
    beachte: ich schlage dir einen ganz anneren Ansatz vor.
    Weil du hast da eine Datenverarbeitung am Wickel, und auch eine m:n-Relation ist erkennbar.
    Da ists wirklich das einfachste, sich in relationale Datenverarbeitung einzuarbeiten, und zB. zu lernen, was eine m:n - Relation ist.
    Weil die bietet einige erhebliche Möglichkeiten, die du dir mit einem unsachgemäßen Ansatz (wies Xml numal hier ist) auf Dauer versaust.

    guggemol vier Views-Videos, wie man den Grund-Struktur einer Datenverarbeitung mit nur 10 Zeilen Code hinkriegen kann.
    das nützt nix, wenn dir das zu hoch ist - dann musstes eben lernen.
    Die m:n - Relation erkenne ich sehr deutlich daran, dass <material_assignment> sowohl eine Property material="Lambert_190_255_130" hat, als auch eine Property target="PES1492__A__1_A_ST_VISUAL_HECKKLAPPE....".

    Das ist die typische Figur einer m:n - Relation, <material_assignment> ist die Zwischen-Tabelle einer solchen, und das ist auch korrekt modelliert, wenn man mehrere Materialien hat, und die mehreren Zielen zuordnen muss, wo sie zu verbauen sind (so reime ichs mir jdfs zusammen - kann mich immer noch irren).

    Strukturelle ists dasselbe wie in die relationale GrundIdee am Beispiel von Personen und Berufen ausgeführt.

    Also wenn du die relationale GrundIdee geschnackelt hast, dann sollteste die 4View-Videos doch eiglich jedes einzelne nachvollziehen können, jeden einzelnen Schritt - brauchst ja nur hinzugucken, wies geht.
    ich habs immer noch nicht geschafft.

    so lese ich die Attribute aus und schreibe sie in eine List of string

    VB.NET-Quellcode

    1. RemoveUnusedShaders()
    2. Dim assignments As New List(Of String)
    3. Dim materials As New List(Of String)
    4. a3sXml.Load(openfilename)
    5. Dim listofassignments As Xml.XmlNodeList = a3sXml.SelectNodes("//material_assignment")
    6. For Each materialassigntmentnode As XmlNode In listofassignments
    7. assignments.Add(materialassigntmentnode.Attributes("material").Value)
    8. Next materialassigntmentnode
    9. Dim listofmaterials As Xml.XmlNodeList = a3sXml.SelectNodes("//material")
    10. For Each materialnode As XmlNode In listofmaterials
    11. materials.Add(materialnode.Attributes("name").Value)
    12. Next materialnode



    leider weiss ich nicht, wie ich die listen jetzt miteinander vergleichen kann?

    es soll geprüft werden, ob die Einträge der Listofmaterials in der Listofassignments vorkommen. wenn nicht, soll der materialsknoten aus dem XML gelöscht werden.

    kann mir jemand auf die sprünge helfen?


    Tom
    naja, mit einer List(Of String) kommst du wohl nicht weiter, wenn du XmlElemente löschen willst.

    Da brauchst du wohl eine List(Of XmlElement)


    Aber ich sags nochmal: in einem typisierten Dataset ist sowas wesentlich einfacher, und kann dir nur wünschen, dass du mit der Zeit doch noch drauf kommst ^^