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?


  • Administrator

    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.


  • Administrator

    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 den XmlReader weiter. Also ein reader.Read() ist nur nötig, wenn du kein XElement 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.


  • Administrator

    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?


Anmelden zum Antworten