如何从XmlReader构建XmlNodes

Joh*_*dol 13 c# xml xmlreader .net-2.0

我正在解析大量的大文件,在分析我的瓶颈后:

XmlDocument doc = new XmlDocument();
doc.Load(filename);
Run Code Online (Sandbox Code Playgroud)

这种方法非常方便,因为我可以像这样提取节点:

XmlNodeList nodeList = doc.SelectNodes("myXPath");
Run Code Online (Sandbox Code Playgroud)

我正在切换到XmlReader,但当我找到我需要提取的元素时,我不知道如何从它构建一个XmlNode,因为不太熟悉XmlReader:

XmlReader xmlReader = XmlReader.Create(fileName);

while (xmlReader.Read())
{
   //keep reading until we see my element
   if (xmlReader.Name.Equals("myElementName") && (xmlReader.NodeType == XmlNodeType.Element))
   {
       // How do I get the Xml element from the reader here?
   }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够构建一个List<XmlNode>对象.我在.NET 2.0上.

任何帮助赞赏!

exe*_*tor 13

为什么不做以下事情呢?

XmlDocument doc = new XmlDocument();
XmlNode node = doc.ReadNode(reader);
Run Code Online (Sandbox Code Playgroud)


Fre*_*örk 6

XmlNode类型没有公共构造函数,因此您无法自己创建它们.你需要有一个XmlDocument可以用来创建它们的东西:

XmlDocument doc = new XmlDocument();
while (xmlReader.Read())
{
    //keep reading until we see my element
    if (xmlReader.Name.Equals("myElementName") && (xmlReader.NodeType == XmlNodeType.Element))
    {
        // How do I get the Xml element from the reader here?
        XmlNode myNode = doc.CreateNode(XmlNodeType.Element, xmlReader.Name, "");
        nodeList.Add(myNode);
    }        
}
Run Code Online (Sandbox Code Playgroud)

  • 这导致只有空节点.您可以使用`doc.ReadNode(reader)`实际将整个节点作为`XmlNode` (5认同)

Abe*_*bel 5

XmlReaderXmlDocument有一个非常独特的处理方式.XmlReader在内存中保留任何内容并使用仅向前的方法,而不是在内存中构建完整的DOM树XmlDocument.当性能成为一个问题时它很有用,但它也要求你以不同的方式编写应用程序:而不是使用XmlNode,你不保留任何东西,只处理"在旅途中":即当一个元素经过你需要的时候,你做点什么 这接近SAX方法,但没有回调模型.

"如何获取XmlElement"的答案是:您必须根据读者的信息从头开始构建它们.不幸的是,这违背了性能提升.除非有少数不同的情况,否则一旦切换到XmlReader,通常最好完全阻止使用DOM方法.

此外,使用XPath提取节点的"非常方便"的方法(SelectNodes如上所示)不能在这里使用:XPath需要一个DOM树.将此方法视为一种过滤方法:您可以向XmlReader添加过滤器,并告诉它跳过某些节点或读取直到某个节点.这非常快,但是思维方式不同.