C# Mehrere Header mit dem XMLWriter

St3vinho85

Cadet 1st Year
Registriert
Sep. 2021
Beiträge
11
Hallo zusammen,

ich muss ein xml Dokument erzeugen und nutze dafür die Klasse XMLWriter.
Die Besonderheit ist, das das Dokument zwei Header besitzen muss, also ungefähr so:


XML:
<?xml version="1.0" encoding="utf-8"?>
<bookstore>
  <book genre="Science Fiction">
    <title>Dune</title>
  </book>
</bookstore>
<?xml version="1.0" encoding="utf-8"?>
<bookstore2>
  <book genre="Novel">
    <title>Old Goriot</title>
  </book>
</bookstore2>


Meine Fragen jetzt dazu sind:
  • Ist das überhaupt zulässig in einem XML Dokument?
  • Wenn ja ist das mit dem XMLWriter umzusetzen?

Vielen Dank schon mal vorab.

VG Steven
 
Zuletzt bearbeitet:
Soweit ich weiß, ist das nicht zulässig. Nur ein Header und ein Root-Element.

Sieht für mich aus, wie zwei XMLs in einer Datei. In dem Fall entweder beide XMLs in einen Stream generieren oder, notfalls, zwei MemoryStreams und dann von dort in den FileStream kopieren.

Ob das direkt mit XMLWriter funktioniert, kann ich jetzt so nicht sagen. Falls er einen Stream als Input annimmt, sollte es aber funktionieren.
 
  • Gefällt mir
Reaktionen: Marco01_809
das ist kein gültiges xml, die deklaration und der root-node darf nur einmal vorkommen. "xmlwriter" gibt es für alle möglichen sprachen, da musst du schon genauer werden. c# laut titel. vermutlich wurden 2 xml-dokumente in eine datei geschrieben.
 
Zuletzt bearbeitet:
Zwei root Elemente, eins mit dem Namen <bookstore>, das andere <bookstore2>. Ist ja mal völlig degeneriert. Da die Elemente gleichartig sind sollten sie auch den gleichen Tag haben. Und dann eine Liste wie z.B. <bookstores> als root.

Wenn du dieses Format für irgendeine bestimmte Software brauchst würde ich zunächst mal schauen ob es nicht bessere Alternativen gibt, bevor ich anfange absichtlich kaputte Dateien zu schreiben.
 
Mal ganz abgesehen davon, dass das in xml sowieso nicht zulässig ist, erschließt sich mir nicht nur die vermeintliche Notwendigkeit zweier Header nicht, sondern auch nicht, dass diese offensichtlich auch noch identisch sind. Bei veschiedenen Headern könnte man vielleicht noch einen Sinn erahnen können, aber in dem Beispiel sehe ich so oder so keinen....
 
Hier geht es um einen Kundenauftrag, dieser hatte mir eine Beispiel xml zur Verfügung gestellt.
Kam mir auch seltsam vor, aber laut deren Dokumentation für diesen Prozess ist es wohl tatsächlich so das es zwei Header geben soll. Hier mal ein Auszug von deren Beispiel:

XML:
<?xml version="1.0"?>
<AccessRequest xml:lang="en-US">
    <AccessLicenseNumber>Your Access License Number</AccessLicenseNumber>
    <UserId>Your Username</UserId>
    <Password>Your Password</Password>
</AccessRequest>
<?xml version="1.0"?>
<ShipmentConfirmRequest xml:lang="en-US">
...
</ShipmentConfirmRequest>
 
Nun, wie ich oben schon schrieb, einfach den Stream nicht schließen und ein weiteres mal mittels eines neuen XMLWriter den zweiten Teil schreiben, als wäre es eine neue XML-Datei (was es faktisch auch ist, nur an die letzte angehangen). Ggf. den ersten XMLWriter nicht schließen (auch nicht automatisch via using).

Oder den ersten Block normal schreiben und schließen und danach die Datei mit "Append" öffnen, um den zweiten Block zu schreiben.
Am besten die beiden Abschnitte wie zwei getrennte XMLs ansehen, welche in dieselbe Datei geschrieben werden.
 
  • Gefällt mir
Reaktionen: St3vinho85 und Raijin
Habe ich mit dem XMLWriter schon auspobiert, leider meckert er dann aber damit, dass dies nur einmal erlaubt ist. Auch wenn ich ihn schliesse und mit der gleichen Datei nochmal öffne bekomme ich eine Exception.
Evtl. hat ja jemand ein Code Beispiel mit dem es funktionert. Ich werde noch ein wenig mit dem XMLWriter spielen. Danke euch schonmal.

Zitat
SirKhan schrieb:
Nun, wie ich oben schon schrieb, einfach den Stream nicht schließen und ein weiteres mal mittels eines neuen XMLWriter den zweiten Teil schreiben, als wäre es eine neue XML-Datei (was es faktisch auch ist, nur an die letzte angehangen). Ggf. den ersten XMLWriter nicht schließen (auch nicht automatisch via using).

Oder den ersten Block normal schreiben und schließen und danach die Datei mit "Append" öffnen, um den zweiten Block zu schreiben.
Am besten die beiden Abschnitte wie zwei getrennte XMLs ansehen, welche in dieselbe Datei geschrieben werden.
 
Dann schreib doch einfach zwei XML-Dateien und merge sie hinterher in eine Datei. Keiner zwingt dich dazu, den ganzen Weg mit dem XMLWriter zu beschreiten. Wie bereits geschrieben wurde widerspricht der Aufbau dieser XML-Datei dem Standard und dann kann man auch nicht erwarten, dass der XMLWriter einen nicht-konformen Umgang mit der Datei unterstützt. Dann bastelt man sich eben zwei 08/15 XML-Dateien und fügt sie anschließend als banale Textdateien zu einer zusammen.
 
  • Gefällt mir
Reaktionen: St3vinho85
Habe es hinbekommen, hier der Code dazu.

C#:
StreamWriter sw = new StreamWriter("Pfad");
XmlWriterSettings settings = new XmlWriterSettings();

settings.ConformanceLevel = ConformanceLevel.Auto;
settings.CloseOutput = false;

XmlWriter writer = XmlWriter.Create(sw, settings);

writer.WriteStartDocument();
writer.WriteStartElement("First_Document");
writer.WriteEndElement();
writer.WriteEndDocument();

writer.Flush();
writer.Close();

writer = XmlWriter.Create(sw, settings);

writer.WriteStartDocument();
writer.WriteStartElement("Second_Document");
writer.WriteEndElement();
writer.WriteEndDocument();

writer.Flush();
writer.Close();

sw.Flush();
sw.Close();
 
  • Gefällt mir
Reaktionen: SirKhan
Du hast es jetzt zwar schon hinbekommen, aber dein/euer Kunde verdient dafür einen Schlag auf den Hinterkopf, denn durch das Ignorieren von Standards entstehen irgendwann in der Zukunft erhebliche Verwirrungen und Wartungsaufwände...
 
Zurück
Oben