C#: XmlWriter hat Error?
Guten Morgen zusammen,
ich habe den folgenden Code in C#, Visual Studio:
XmlWriterSettings settings = new XmlWriterSettings();
settings.Async = true;
settings.NewLineOnAttributes = true;
using (XmlWriter writer = XmlWriter.Create("filePath", settings))
{
writer.WriteStartDocument();
writer.WriteStartElement("pantomime");
foreach (var word in pantomime)
{
writer.WriteElementString("word", word);
}
writer.WriteEndElement();
//writer.WriteStartElement("explain");
//writer.WriteEndElement();
writer.WriteStartElement("draw");
foreach (var word in draw)
{
writer.WriteElementString("word", word);
}
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Close();
}
Das Ziel ist es, Wörter in eine XML-Datei zu schreiben. Dabei bekomme ich folgende Fehlermeldung bei dem ersten "writer.WriteEndElement", welches "pantomime" schließen sollte:
Error: Exception: Token StartElement in state EndRootElement would result in an invalid XML document. Make sure that the ConformanceLevel setting is set to ConformanceLevel.Fragment or ConformanceLevel.Auto if you want to write an XML fragment.
Und ich bin mir nicht sicher, was der Fehler ist. Meine Recherche hat ergeben, dass das "WriteEndElement" anscheinend nicht richtig schließt.
2 Antworten
Dein Problem ist dass dein Code kein valides XML erzeugt.
Du kannst nicht dein Root Element (=pantomime) schließen und dann ein weiteres, paralleles Element "draw" schreiben.
Dein XML würde in etwa so aussehen:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pantomime>
<word>foo</word>
</pantomime>
<draw>
<word>bar</word>
</draw>
Und sollte in etwa so aussehen um valide zu sein:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- es fehlt ein umschließendes Root Element sobald du neben pantomime ein weiteres Element schreibst -->
<root>
<pantomime>
<word>foo</word>
</pantomime>
<draw>
<word>bar</word>
</draw>
</root>
Wie du siehst fehlt die ein umschließendes Root Element für die Elemente pantomime und draw.
XML darf nur ein Root-Element haben, Du hast aber zwei Root-Elemente.
Der XmlWriter kann das zwar, das musst Du ihm aber erst erlauben, indem Du den ConformanceLevel entsprechend setzt.
Oder Du schreibst ein Root-Element um alles drum herum.
Ach ja:
Das Close am Ende brauchst Du nicht, das macht das using automatisch.
Und das WriteStartDocument und WriteEndDocument brauchst Du auch nicht.
Und die Settings ebenfalls nicht, außer Du möchtest noch auf Async umstellen oder Attribute verwenden.