xmlreader
-
Hi,
ich lese eine große Xml Datei sequentiell mit dem XmlReader ein, ich schaue nach dem Knoten und selektiere mir die die ich brauche
dann einfach heraus.
Funktioniert auch solange die Datei so aussieht
<Node>
...
</Node>
sobald aber ein start und endtag auf der gleichen Zeile sind wird der Knoten nicht erkannt zb so
</Node><Node>
...
</Node><Node>
erst der dann folgende wird übernommen.
Gibt es eine Möglichkeit das zu ändern?
-
Zeig mal etwas Code, möglichst kompilierbar, welcher dieses Verhalten aufzeigt. Also ein kleines Konsolenprogramm oder sowas. Ich kann das nämlich nicht nachvollziehen, dass das Element nicht erkannt wird.
Grüssli
-
Mit dieser Xml Datei
<?xml version="1.0" encoding="utf-8" ?>
<Nodes>
<Node>
<Test>1</Test>
</Node><Node>
<Tes>2</Tes>
</Node><Node>
<Test>3</Test>
</Node>
</Nodes>und diesen Code
using (XmlReader reader = XmlReader.Create(filename)) { reader.MoveToContent(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Node") { Console.WriteLine((XElement.ReadFrom(reader) as XElement).ToString()); } } }
erhalte ich nur die Knoten mit den Werten für Test 1 und 3, 2 wird übergangen.
-
using(XmlReader reader = XmlReader.Create(filename)) { reader.MoveToContent(); bool run = reader.Read(); while(run) { if(reader.NodeType == XmlNodeType.Element && reader.Name == "Node") { Console.WriteLine((XElement.ReadFrom(reader) as XElement).ToString()); } else { run = reader.Read(); } } }
XElement.ReadFrom
schiebt anscheinend denXmlReader
weiter. Also einreader.Read()
ist nur nötig, wenn du keinXElement
ausgelesen hast. Muss sagen, dass ich dies ziemlich verwirrend finde, da ich in der Dokumentation nichts dazu finden konnte. Einen gewissen Sinn, macht es aber durchaus.Grüssli
-
Wenn du eh schon mit Linq to XML Klassen (XElement) arbeitest dann kannst des doch auch gleich richtig machen. In etwa so:
using(XmlReader reader = XmlReader.Create(filename)) { XElement xmlFile = XElement.Load(reader); var nodes = xmlFile.Descendants("Node"); foreach(var node in nodes) { Console.WriteLine(node); } }
Nodes ist dann ne Collection deiner "Node" Nodes, wiederum jeweils als XElement. Der Code müsste genau das gleiche machen wie der ursprüngliche.
-
Talla schrieb:
Nodes ist dann ne Collection deiner "Node" Nodes, wiederum jeweils als XElement. Der Code müsste genau das gleiche machen wie der ursprüngliche.
Naja, aber einen entscheidenden Unterschied hat es: Der Speicherverbrauch.
Grüssli
-
Hi,
danke erstmal für die Antwort hat funktioniert, nur seltsam das das Verhalten so nirgendwo beschrieben ist.
Aber wegen Linq, muss es auf diesen Weg machen da die Xml Dateien auch mal gerne bis 8gb gehen.
-
Eine XML Datei von 8GB ?!
-
ROFL
Wieviel RAM braucht man wohl um eine 8GB XML Datei gegen ein Schema zu validieren?