それをメモリにロードし、XElementオブジェクトを使用せずに大規模なXMLファイルを読み込む方法

StackOverflow https://stackoverflow.com/questions/2249875

質問

私は、大規模なXMLファイル(100 + M)を読みたいです。その大きさにより、私はのXElementを使用してメモリにロードする必要はありません。私はそれを解析して読み取るためにLINQ-XMLクエリを使用しています。

それを行うための最善の方法は何ですか? LINQ-XML / XElementオブジェクトとのXPathの組み合わせまたはXmlReaderを上の任意の例?

助けてください。おかげます。

役に立ちましたか?

解決

はい、あなたはとしたXmlReaderを組み合わせることができます方法XNode.ReadFrom を、選択のXElementとしてたXmlReaderによって見出さノードを処理するためのC#を使用してドキュメントの例を参照してください。

他のヒント

次のように

XNode.ReadFromメソッドのMSDNドキュメントのサンプルコードは

class Program
{
    static IEnumerable<XElement> StreamRootChildDoc(string uri)
    {
        using (XmlReader reader = XmlReader.Create(uri))
        {
            reader.MoveToContent();
            // Parse the file and display each of the nodes.
            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        if (reader.Name == "Child")
                        {
                            XElement el = XElement.ReadFrom(reader) as XElement;
                            if (el != null)
                                yield return el;
                        }
                        break;
                }
            }
        }
    }

    static void Main(string[] args)
    {
        IEnumerable<string> grandChildData =
            from el in StreamRootChildDoc("Source.xml")
            where (int)el.Attribute("Key") > 1
            select (string)el.Element("GrandChild");

        foreach (string str in grandChildData)
            Console.WriteLine(str);
    }
}

しかし、私は次のように例のStreamRootChildDoc方法を変更する必要があることを発見しました。

    static IEnumerable<XElement> StreamRootChildDoc(string uri)
    {
        using (XmlReader reader = XmlReader.Create(uri))
        {
            reader.MoveToContent();
            // Parse the file and display each of the nodes.
            while (!reader.EOF)
            {
                if (reader.NodeType == XmlNodeType.Element && reader.Name == "Child")
                {
                    XElement el = XElement.ReadFrom(reader) as XElement;
                    if (el != null)
                        yield return el;
                }
                else
                {
                    reader.Read();
                }
            }
        }
    }

ちょうどあなたがファイルを順番に読む必要がありますし、兄弟や子孫に言及することは最悪で最高の状態で遅いとは不可能であることを行っていることに留意してください。そうでなければ@MartinHonnnは、鍵を持っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top