Laden...

Aus XML-Daten bestimmte Tags samt Inhalt auslesen

Erstellt von DeZio vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.160 Views
DeZio Themenstarter:in
76 Beiträge seit 2008
vor 11 Jahren
Hinweis von Abt vor 11 Jahren

Ich habe den Data-Teil gekürzt, sodass die Seite nicht völlig zerrissen wird.

EDIT herbivore: Der Original-Titel war "Explode byte Array"

Aus XML-Daten bestimmte Tags samt Inhalt auslesen

Hallo Leute,

ich lasse eine Datei von A nach B senden. Dabei möchte ich die Datei in kleine Parts schicken können. Das muss aber in Parts geschehen, da es ja die berüchtigte 65535 gibt.

Hierzu habe ich eine Klasse geschrieben, die Part, Parts und Data enthält. Alle Parts zusammen und hintereinander sollen dann eine gültige Datei ergeben.
Zum Senden wird die Klasse serialisiert. Empfangen wird dann folgendes: (Das ist der Encoding.Default.GetString( ) - Output)

##########<?xml version="1.0"?>
<SecureMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Message>PARTED_FILE: Programmierkonventionen.pdf</Message>
  <Part>0</Part>
  <Parts>364</Parts>
  <Data>1AEF112185C6C66084C272F77AC ... DB4FE485380677AEC1C26DE3D85810CC6D2B9F</Data>
  <ConnectionId>abf29177-4980-468b-a452-b26b7b817b1f</ConnectionId>
</SecureMessage>####################<?xml version="1.0"?>
<SecureMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Message>PARTED_FILE: Programmierkonventionen.pdf</Message>
  <Part>1</Part>
  <Parts>364</Parts>
 <Data>1AEF112185C6C66084C272F77ACD6 ... 64E4F101B2D97FCD8685C0A60A31C810063F50A</Data>
  <ConnectionId>abf29177-4980-468b-a452-b26b7b817b1f</ConnectionId>
</SecureMessage>####################<?xml version="1.0"?>
<SecureMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Message>PARTED_FILE: Programmierkonventionen.pdf</Message>
  <Part>2</Part>
  <Parts>364</Parts>
 <Data>1AEF112185C6C66084C272F77ACD6 ... 0A60A31C810063F50A688F3B810063354AE28C9</Data>
  <ConnectionId>abf29177-4980-468b-a452-b26b7b817b1f</ConnectionId>
</SecureMessage>####################<?xml version="1.0"?>
<SecureMessage xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Message>PARTED_FILE: Programmierkonventionen.pdf</Message>
  <Part>3</Part>
  <Parts>364</Parts>
  <Data></Data>
  <ConnectionId>abf29177-4980-468b-a452-b26b7b817b1f</ConnectionId>
</SecureMessage>##########

Dies steht dann hintereinander in einem byte[].
Nun möchte ich, dass ich an jedes einzelne <SecureMessage>..</SecureMessage> herankomme, um dieses anschließend deserialisieren zu können. Als Idee zum Patternsearching hatte ich ein START_OF_PACKET und END_OF_PACKET, die hier nun ########## sind. Aber damit bin ich leider überhaupt gar nicht weitergekommen.

Frage: Wie kann ich ein byte-Array "exploden/splitten"?

Guten Morgen, Gute Nacht.

DeZio

C
2.121 Beiträge seit 2010
vor 11 Jahren

Wo gibt es die 65535?
Warum willst du das alles ausgerechnet an den Grenzen einer Message aufteilen?
Du kannst das XML aus deinen kompletten Daten erstellen und das dann als String so aufteilen dass die Länge immer passt. Der Empfänger setzt das wieder zusammen.
Aus einem String die XML-Teile extrahieren geht z.B. mit XmlDocument oder XmlReader.

Ich lese da nicht ganz heraus wo genau dein Problem besteht.
Wenn du das mit WCF verschickst hast du überhaupt kein Problem mit Grenzen. Wenn du es per TCP verschickst, ist die Grenze irgendwo, nicht genau bei 65535.

16.806 Beiträge seit 2008
vor 11 Jahren

Ich realisier so etwas ähnliches über WCF - nur anders 😉

Dateiteile heißen in dieser Umgebung nicht Parts, sonder Chunks. Allein mit diesem Wort wirst Du bei der Suche schon sehr viel mehr finden, als mit Parts.

Ich würde (nein, ich tus) das nicht mit XML übertragen, sondern mit WCF und MTOM aufgrund der Performance und der enthaltenen Komprimierung. Es spart deutlich Bandbreite.

Die Nachteile Deiner XML wären, dass Du bei kleinen Dateien deutlich mehr Overhead als Inhalt hättest. Macht nicht so arg viel sinn.
Ansonsten unterstütz ich hier chilic: es gibt kein Limit von 65535. Mein Limit ist individuell, von 5MB bis 500 MB Chunks.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo DeZio,

ich sehe keinen Grund, warum du die Daten auf byte-Array-Ebene bearbeiten willst. Wandele die Daten mit dem passenden Encoding in einen (XML-)String um, den du dann mit dem XML-Klassen aus dem Framework (siehe Beitrag von chilic) bearbeiten und natürlich auch einzelne/alle Knoten auslesen kannst.

Manchmal ist es besser, einfach schlafen zu gehen, als mitten in der Nacht unbedingt noch eine (unsinnige oder sagen wir unausgereifte) Frage zu stellen.

herbivore

849 Beiträge seit 2006
vor 11 Jahren

Das ist zufällig die Default Message Size von BasicHttpBinding.. und ich denke auch von anderen Bindings schaust Du hier: BasicHttpBinding.MaxReceivedMessageSize-Eigenschaft Vllt liegt hier der Hund begraben 😃