Byte[] => XMLDocument

Hallo Wissende,

ich habe folgendes Problem: Wie kann ich am effizientesten ein Byte-Array in ein XMLDocument umwandeln? Hintergrund: Ich habe eine zip-Library, mit der ich eine XML-Datei lese. Leider gibt mir diese nur ein byte[] zurück, das der Konstruktor von XMLDocument nicht direkt annimmt. Daher bin ich vorerst den Umweg über einen MemoryStream gegangen, was natürlich den Nachteil hat, dass das Dokument unnötigerweise doppelt im Speicher liegt. Gibt es da einen einfacheren Weg? Ach ja, ich verwende übrigens .NET 2.0.

Gruß
Chondron

Wie kommst du denn darauf???
MS verwendet zumindest beim einfachen byte[]-Konstruktor das selbe Array.

Hallo Mars,

Wie kommst du denn darauf???
MS verwendet zumindest beim einfachen byte[]-Konstruktor das
selbe Array.

Wie komme ich worauf? Dass der Konstruktor von XMLDocument kein byte[] annimmt? Ich habe mich da vielleicht etwas ungenau ausgedrückt: Ich meine nicht den Konstruktor, sondern die Methode XMLDocument.Load(), mit der man Daten in das XMLDocument einlesen kann. Und die akzeptiert leider keine Byte-Arrays.

Gruß
Chondron

Jetzt habe ich mich ungenau ausgedrückt. Ich meinte natürlich den MemoryStream Konstruktor.

Hallo,

darum geht es doch gerade: Ich will auf den MemoryStream verzichten, weil er nur als Bindeglied zwischen dem byte[] und dem XMLDocument dient. Es müsste doch einen einfacheren und schnelleren Weg geben, ein XMLDocument mit den Daten aus dem byte[] zu erzeugen…

Gruß
Chondron

Offensichtlich gibt es aber kein Möglichkeit ein XMLDocument aus einem byte[] zu erzeugen. Was ist an dem Umweg über den MemoryStream so kompliziert, bzw langsam?

Hallo Chondron,

probiers mal damit:

string str = Convert.ToBase64String(test);

Bin mir aber nicht sicher wie das byte Array dazu aussehen soll.

mfg

Dirk.Pegasus

Hallo Mars,

Offensichtlich gibt es aber kein Möglichkeit ein XMLDocument
aus einem byte[] zu erzeugen. Was ist an dem Umweg über den
MemoryStream so kompliziert, bzw langsam?

es ist nicht kompliziert und bei der Größe der XML-Dokumente auch noch nicht wirklich relevant im Hinblick auf Performance und Ressourcen. Trotzdem stört es mich, dass ich für eine simple Umwandlung beinahe identischer Typen die Daten nochmal komplett zwischenspeichern müssen soll. Aber gut, die Macher von .NET sind da wohl anderer Meinung…

Gruß und danke für die Antwort
Chondron

Hallo Dirk,

das wird wie ich das sehe leider nicht funktionieren, da Convert.ToBase64String() ein Array von 8-Bit-Ganzzahlen erwartet, und ich ein Array vorliegen habe, das normalen Text (buchstabenweise) enthält…

Gruß
Chondron

Du musst hier ja nichts doppelt zwischenspeichern, MemoryStream ist nur ein Wrapper für dein byte[]!

Hallo Chondron,

das du die bytes als text interpretierst ist ja ok, aber letzlich sind das auch nur bytes. Ein „a“ ist dann 64 (oder 010101 oder so). Kannst du mal ein paar byte posten und sagen,wie der text lauten soll? ME ist das Ziel doch die Bytes als Text zu interpretieren, daher eine Typumwandlung.

mfg

Dirk.Pegasus

Hallo Dirk,

hier der entsprechende Quelltext. Die Klassen ZipArchive und ZipFile stammen aus einer kommerziellen Zip-Library. Wichtig ist nur, dass ZipArchive.GetContent() einen byte[] zurückgibt, aber XMLDocument.Load() einen Stream, einen Dateinamen, einen TextReader oder einen XMLReader erwartet. Ein String würde in diesem Fall also sowieso nichts nutzen.

ZipArchive za = new ZipArchive();
za.Load("C:\test.zip");
ZipFile zf = ziparchive.GetFileOf("index.xml");
byte[] b = zf.GetContent();
XMLDocument xmldoc = new XMLDocument();

using (Stream m = new MemoryStream(b))
{
 m.Position = 0; //rewind stream
 xmldoc.Load(m); 
}

Gruß
Chondron

Hallo Mars,

Du musst hier ja nichts doppelt zwischenspeichern,
MemoryStream ist nur ein Wrapper für dein byte[]!

doch, ein MemoryStream ist ein Stream, der zwischengespeichert wird, also Platz einnimmt. Siehe auch den Quellcode, den ich weiter oben gepostet habe.

Gruß
Chondron

Hallo Chondron!

Du musst hier ja nichts doppelt zwischenspeichern,
MemoryStream ist nur ein Wrapper für dein byte[]!

doch, ein MemoryStream ist ein Stream, der zwischengespeichert
wird, also Platz einnimmt. Siehe auch den Quellcode, den ich
weiter oben gepostet habe.

Also nochmal: MemoryStream verwendet das selbe byte[] und keine Kopie, somit wird nichts doppelt gespeichert. Du brauchst nur einige Bytes für die Objektverwaltung von .Net sowie die Instanzvariablen.

1 Like

Hallo Mars,

Also nochmal: MemoryStream verwendet das selbe byte[] und
keine Kopie, somit wird nichts doppelt gespeichert. Du
brauchst nur einige Bytes für die Objektverwaltung von .Net
sowie die Instanzvariablen.

ich habs gerade ausprobiert weil ichs nicht glauben konnte, aber du hast Recht, der MemoryStream ist nur eine Referenz, keine Kopie. Ich bitte um Entschuldigung für meine Sturheit :wink:
Gut, im Prinzip wäre da immer noch der hässliche Umweg über den byte[] in das XMLDocument zu bemängeln, aber da die Zip-Library nicht mehr Methoden besitzt, kann man da wohl wirklich nichts machen…

Gruß und *
Chondron

Hallo Chondron,

für einen String gibt es

doc.LoadXml(string)

Ansonsten hab ich auch keine Idee mehr…

mfg

Dirk.Pegasus