| 

.NET C# Java Javascript Exception

3
Hallo,

ist es möglich den Stream des XmlReaders nach dem initialisieren zu steuern? Folgendes geht:

using (FileStream fs = new FileStream("test.xml", FileMode.Open, FileAccess.Read))
{
fs.Seek(123, SeekOrigin.Begin);
using (XmlReader reader = XmlReader.Create(fs))
{
reader.Read()
}
}


Könnte man es auch schaffen den Stream so zu steuern, dass man so zu sagen fs.Seek() innerhalb des XmlReader-using-Blocks benutzen könnte? Wenn ich genau das nämlich versuche, zeigt sich der XmlReader unbeeindruckt und fängt mit dem Lesen am Anfang der Datei an.

Edit:
Der Grund warum ich das tun möchte:
Ich lege einen Index einer XML-Datei zu bestimmten Knoten an. Die Knoten kann ich dann beliebig in Sekundenbruchteil auslesen, auch wenn die Datei mehrere GB groß ist. Das ist schon ganz schön schnell, jedoch muss ich für jedes auslesen den XmlReader immer neu initialisieren, mit dem FileStream und seinem Cursor an der entsprechenden Stelle. Deswegen die Frage. Ich würde gerne auf die wiederholte Neuinitialisierung verzichten. Das würde mir z.B. auch ermöglichen, innerhalb des XmlReader-Blocks mit Indizes zu arbeiten.
News:
27.03.2014
Siggi 229 7
Was genau ist der Use Case? Normalerweise bewegt man sich in einem XML-Dokument doch element-weise. Seek navigiert hingegen auf byte-Ebene. Was hast Du davon, auf einmal möglicherweise mitten in einem XML-Element zu stehen?
Matthias Hlawatsch 27.03.2014
Ich muss Matthias zustimmen. Es macht für mich ebenfalls keinen Sinn, mitten in einem XML anzufangen zu lesen. Selbst wenn du einen bestimmten Teil einfach überspringen willst, hast du ein Problem, sobald sich der Inhalt oder die Struktur des XML ändert.
luedi 28.03.2014
@Matthias Hlawatsch && luedi:
Tut mir Leid, dass ich erst so spät antworte. Ich habe meine Frage um einen Grund ergänzt, der eure Fragen beantworten sollte.
Siggi 30.03.2014
1 Antwort
0
Wie ich in meiner Antwort hier schon beiläufig erwähnt habe, würde ich mal versuchen, mit einem MemoryMappedFile zu arbeiten. Zu dessen Performance hatten wir vor nicht allzu langer Zeit auch schon eine ausgiebige Diskussion.
30.03.2014
ffordermaier 8,4k 3 9
Ok, Performance-mäßig ist MMF schneller als ein FileStream, wenn ich das richtig verstanden habe(Interessant für die Indexerstellung). Das würde mir dennoch nicht helfen, nach der Initialisierung des XmlReaders, den Zeiger im Stream beliebig zu verschieben.
Siggi 30.03.2014
Das nicht, aber ich gehe davon aus, dass die Erzeugung eines ViewStreams im MMF und anschließender Initialiserung des XMLReaders schneller ist. Wenn der XmlReader die Positionierung im Stream nach Initialisierung nicht schluckt, hilft nur ein Blick in dessen SourceCode. Vlt. findest Du dort einen Hinweis, wie Du den Stream bereitstellen musst, damit der XmlReader das annimmt. Das ist aber definitiv keine robuste Lösung und fällt unter die Kategorie Workaround/Hack. Ich würde eine Klasse erstellen, die mir auf Anfrage einen !!neuen!! XmlReader bereitstellt, wenn ich nach einer Position frage.
ffordermaier 30.03.2014
Das ist dass, was mir wohl übrig bleiben wird. Der XmlReader ist anscheinend nicht für beliebige Sprünge optimiert. Jetzt ist der Code schon verdammt schnell mit dem FileStream, im Vergleich zum sequentiellen suchen. Wenn ich es noch schneller hin bekomme, um so besser.
Siggi 31.03.2014
Freut mich, dass Du zu einer tragfähigen Lösung gekommen bist. Sei bitte so gut und berichte abschließend grob, was Du final an Performance rauskitzeln konntest. Das ist immer interessant :)
ffordermaier 31.03.2014

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH