InTheVoid Geschrieben 18. Dezember 2019 Geschrieben 18. Dezember 2019 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 ? Zitieren
1 _n4p_ Geschrieben 19. Dezember 2019 Geschrieben 19. Dezember 2019 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 InTheVoid reagierte darauf 1 Zitieren
0 Whiz-zarD Geschrieben 19. Dezember 2019 Geschrieben 19. Dezember 2019 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. Zitieren
0 KeeperOfCoffee Geschrieben 19. Dezember 2019 Geschrieben 19. Dezember 2019 (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 19. Dezember 2019 von KeeperOfCoffee Zitieren
0 InTheVoid Geschrieben 19. Dezember 2019 Autor Geschrieben 19. Dezember 2019 (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 19. Dezember 2019 von InTheVoid Whiz-zarD und JimTheLion reagierten darauf 2 Zitieren
-1 Visar Geschrieben 18. Dezember 2019 Geschrieben 18. Dezember 2019 '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 Zitieren
Frage
InTheVoid
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:
Meine xml Datei sieht aktuell so aus:
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
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.