Benutzer mit den meisten Antworten
Modifizieren einer XML-Datei mit LinqToXML

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- Bearbeitet Robert BreitenhoferModerator Donnerstag, 22. September 2011 07:26 Formatierung
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- Bearbeitet Martin Honnen Donnerstag, 22. September 2011 14:20 Ergänzung
- Als Antwort markiert Marcel RomaModerator Donnerstag, 22. September 2011 19:20
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- Bearbeitet Martin Honnen Mittwoch, 21. September 2011 16:42 Code-Korrektur
- Als Antwort vorgeschlagen Robert BreitenhoferModerator Donnerstag, 22. September 2011 07:27
-
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.
-
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- Bearbeitet Martin Honnen Donnerstag, 22. September 2011 14:20 Ergänzung
- Als Antwort markiert Marcel RomaModerator Donnerstag, 22. September 2011 19:20