我想读一个大的xml文件(100 + M)。由于它的大小,我不想使用XElement将其加载到内存中。我正在使用linq-xml查询来解析和读取它。
最好的方法是什么?关于XPath或XmlReader与linq-xml / XElement组合的任何示例?
请帮忙。感谢。
答案 0 :(得分:7)
是的,您可以将XmlReader与method XNode.ReadFrom结合使用,请参阅文档中的示例,该文档使用C#有选择地将XmlReader找到的节点处理为XElement。
答案 1 :(得分:5)
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();
}
}
}
}
答案 2 :(得分:1)
请记住,您必须按顺序读取文件,并且提及兄弟姐妹或后代最好是慢的,最坏的情况是不可能的。否则@MartinHonnn有钥匙。