Zum Inhalt springen
  • 0

xml erweitern mit XDocument


Frage

Geschrieben

Ich schreib grad ein kleines Programm und möchte Eigenschaften einer Maschine in eine existierende xml Datei schreiben.

Leider klappt das nicht. Meine Linq und xml Kenntnisse sind nicht gerade der Hit ?

Das hier ist meine Function die in meine xml Datei schreiben soll:

public void SaveDataToXml(Machine machine)
        {
                XDocument xDoc = XDocument.Load("Data\\Machines.xml");
                xDoc.Add(new XElement("Machines",
                            new XElement("Name", machine.name),
                            new XElement("Immobilie", machine.immobilie),
                            new XElement("Abschnitt", machine.abschnitt),
                            new XElement("CodeTyp", machine.codeTyp),
                            new XElement("Bauteilinfo", machine.bauteilinfo)));           
        }

Meine xml Datei sieht aktuell so aus:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  
</root>

Ich bekomme folgenden Fehler:

System.InvalidOperationException: "This operation would create an incorrectly structured document."
 

Kann jemand meine Function korrigieren und mir erklären was Falsch war? Danke ?

5 Antworten auf diese Frage

Empfohlene Beiträge

  • 1
Geschrieben

aber XContainer hat die Methode .. steht sogar in dem verlinkten Dokument.

vor einer Stunde schrieb InTheVoid:

mir erklären was Falsch war?

In der Dokumentation steht:

Zitat

This method adds the new content after the existing content of the XContainer.

du würdest also dies als XML generieren

<?xml version="1.0" encoding="utf-8" ?>
<root>
  
</root>
<Machines>
  <Name>
    [..]

du solltest deine Elemente an das Root-Element des Documents anhängen

  • 0
Geschrieben
vor 6 Stunden schrieb Visar:

'n Abend,

in .NET Framework 4.7+ wird keine Methode "Add" für die Klasse XDocument beschrieben:

https://docs.microsoft.com/en-US/dotnet/api/system.xml.linq.xdocument?view=netframework-4.8

Natürlich gibt es die Methode. Steht sogar in deinem verlinkten Dokument... Wie soll man denn sonst einen Wurzelknoten hinzufügen?

BTT: Der Grund für die Exception ist, wie @_np4_ schon sagt, dass du deine Elemente an den Wurzelknoten anhängen musst. Ein XML-Dokument ist eine Baumstruktur und eine Baumstruktur hat immer nur ein Wurzelknoten. Da du in der Datei aber schon einen Wurzelknoten, mit dem Namen root, vorgibst, versuchst du mit deinem Code einen zweiten hinzuzufügen, was dann mit einer Exception quittiert wird.

Falls die Datei immer leer ist, könntest du auch direkt mit dem Konstuktor von XDocument arbeiten, anstatt mit der Load()-Methode. Dann brauchst du die Datei nicht.

  • 0
Geschrieben (bearbeitet)

Wenn du nach einer bestimmten Node ein XElement hinzufügen willst, dann musst du erstmal dieser in deinem XDocument finden.

Beispiel:

// hier findest du eine spezielle Node in deinem XDocument
XElement node = xdoc.Descendants("user").FirstOrDefault(o => (string)o.Attribute("Age") == customer.age);

// Jetzt da du diese Node gefunden hast, kannst du damit arbeiten z.B. nach dieser etwas hinzufügen

node.AddAfterSelf(new XElement("Orders", 10),
				 new XElement("City", ...),
				new XElement(...));

// wenn du an der Root (oder wie dein Root-Element heißt) etwas hinzufügen willst
doc.Root.Add(new XElement(...));

Einfach mal rumbasteln. Du musst einfach verstehen, dass das Ding ein Tree ist und "Add" alleine nicht viel hilft.

Bearbeitet von KeeperOfCoffee
  • 0
Geschrieben (bearbeitet)

Hallo habs Geschafft ?

Falls es jemanden Interessiert:

public void SaveToXml(AzMaschine azMaschine, string filename)
        {
            XDocument xdoc = XDocument.Load(@"C:\Users\klein\source\repos\xmlToDataGrid\Data\Maschinen.xml");
            XElement maschine =     new XElement("Maschine",
                                          new XElement("Name", azMaschine.name),
                                          new XElement("Immobile", azMaschine.immobilie),
                                          new XElement("Abschnitt", azMaschine.abschnitt),
                                          new XElement("Bauteilinfo", azMaschine.bauteilinfo));
            xdoc.Root.Add(maschine);
            xdoc.Save(@"C:\Users\klein\source\repos\xmlToDataGrid\Data\Maschinen.xml");
        }

Werde den hardcodierten Pfad noch durch den übergebenen Filename austauschen. ?

Bearbeitet von InTheVoid

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Diese Frage beantworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...