それをメモリにロードし、XElementオブジェクトを使用せずに大規模なXMLファイルを読み込む方法
-
20-09-2019 - |
質問
私は、大規模な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は、鍵を持っています。
所属していません StackOverflow