none
Modifizieren einer XML-Datei mit LinqToXML RRS feed

  • Frage

  • Hallo, ich möchte diese XML-Struktur (vereinfacht dargestellt)

    <?xml version="1.0" encoding="UTF-8"?>
    <document xsi:schemaLocation="..." xmlns="..." xmlns:wfs="..." xmlns:gml="..." xmlns:xs="..." xmlns:xsi="...">
     <includes>
      <wfs:collection>
       <gml:feature>
        <element gml:id="1">
        <number>1000</number>
        </element>
       </gml:feature>
       <gml:feature>
        <element gml:id="2">
        <definition>text</definition>
        </element>
       </gml:feature>
      </wfs:collection>
     </includes>
    </document>

    umwandeln in folgende XML-Struktur:

    <?xml version="1.0" encoding="UTF-8"?>
    <document xsi:schemaLocation="..." xmlns="..." xmlns:wfs="..." xmlns:gml="..." xmlns:xs="..." xmlns:xsi="...">
     <definition>text</definition>
      <includes>
       <wfs:collection>
        <gml:feature>
         <element gml:id="1">
         <number>1000</number>
         </element>
        </gml:feature>
       </wfs:collection>
      </includes>
    </document>
     

    Die Definition soll also nicht als <feature> innerhalb der <collection> erscheinen, sondern als eigenständiges Element direkt nach dem Header.

    Bisher kann ich mit LinqToXML nur innerhalb der <collection> Elemente verschieben und löschen.

    Gibt es da eine Möglichkeit mit LinqToXML?

    Vielen Dank für Eure Hilfe

    madlux

    Mittwoch, 21. September 2011 14:48

Antworten

  • Poste bitte mal die genaue und komplette Fehlermeldung. Gibt es die Fehlermeldung beim Kompilieren oder erst bei der Ausführung des Programmcodes?

    Hmm,  ich glaube, der Fehler ist im

      Where(f => f.Descendants(df + "definition")

    das muss

      Where(f => f.Descendants(df + "definition").Any())

    lauten, komplett also

      doc.Descendants(gml + "feature").Where(f => f.Descendants(df + "definition").Any()).Remove();


    MVP Data Platform Development My blog
    Donnerstag, 22. September 2011 14:18

Alle Antworten

  • Die Namensraum-Deklarationen im XML sind wichtig, wenn man XML programmatisch manipulieren will. Diese nicht zu zeigen, macht das Helfen schwierig.

    Versuche es mal mit

    XDocument doc = XDocument.Load("eingabe.xml");

    XNamespace df = doc.Root.Name.Namespace;

    XNamespace gml = "..."; // hier entsprechenden Namensraum definieren

    doc.Root.AddFirst(doc.Descendants(df + "definition"));

    doc.Descendants(gml + "feature").Where(f => f.Descendants(df + "definition").Remove();

    doc.Save("ausgabe.xml"); // bei Bedarf kann man hier die ursprüngliche Datei überschreiben


    MVP Data Platform Development My blog
    Mittwoch, 21. September 2011 15:54
  • Vielen Dank. Das Umschreiben und Speichern funktioniert jetzt schonmal! Nur das Löschen des Elements klappt noch nicht. doc.Descendants(gml + "feature").Where(f => f.Descendants(df + "definition").Remove(); Hierbei kommt als Fehlermeldung, dass eine implizite Konvertierung nicht möglich ist. Ich habe es noch folgendermaßen versucht: var XElement = (from element in doc.Elements("includes").Elements(wfs + "collection").Elements(gml + "feature").Elements("element") where element.Attribute(gml + "id").Value == "2" select element); XElement.Remove(); Dies lässt sich ohne Fehler ausführen, löscht aber auch nicht das Element. Für einen weiteren Tipp wäre ich dankbar.
    Donnerstag, 22. September 2011 13:35
  • Poste bitte mal die genaue und komplette Fehlermeldung. Gibt es die Fehlermeldung beim Kompilieren oder erst bei der Ausführung des Programmcodes?

    Hmm,  ich glaube, der Fehler ist im

      Where(f => f.Descendants(df + "definition")

    das muss

      Where(f => f.Descendants(df + "definition").Any())

    lauten, komplett also

      doc.Descendants(gml + "feature").Where(f => f.Descendants(df + "definition").Any()).Remove();


    MVP Data Platform Development My blog
    Donnerstag, 22. September 2011 14:18
  • doc.Descendants(gml + "feature").Where(f => f.Descendants(df + "definition").Any()).Remove(); sehr gut, das klappt, vielen Dank
    Donnerstag, 22. September 2011 14:34