从 XmlDocument 到 XmlReader .Net

Posted

技术标签:

【中文标题】从 XmlDocument 到 XmlReader .Net【英文标题】:From XmlDocument To XmlReader .Net 【发布时间】:2012-02-19 23:00:18 【问题描述】:

根据用户的建议回答了我的问题,我正在尝试将我的 XmlDocument 代码转换为 XmlReader 代码,但我遇到了一些麻烦。

这是 XML(从 php-mysql 页面生成)

<row>
<idLink>64</idLink>
<idHost>3</idHost>
<url>http://www.google.com</url>
</row>
<row>
<idLink>68</idLink>
<idHost>4</idHost>
<url>http://www.bing.com</url>
</row>
..... until about 10000 rows

这是我的 XmlDocument 代码:

   xmlDoc.Load("http://www.myUrl.com/list.php");
      if (xmlDoc.DocumentElement != null)
          foreach (XmlNode node in xmlDoc.DocumentElement)
             
              if (node.Name == "row")
                
                  list.Add(new Links  
                       idLink = Convert.ToInt32(node.ChildNodes[0].InnerText),
                       idHost = Convert.ToInt32(node.ChildNodes[1].InnerText),
                       url = node.ChildNodes[2].InnerText ); 
                  
               
             return list;

现在我在 XmlReader 中转换时遇到了一些麻烦,我尝试了很多代码但我无法处理它。

using (XmlReader reader = new XmlTextReader("http://myUrl.com/list.php"))
          
          if (reader.NodeType == XmlNodeType.Element) 
           ?????

【问题讨论】:

坦率地说,尝试(稳健地)使用 XmlReader 读取 xml 非常困难。你想在这里做什么?你的目标是什么? xml 的大小是多少? @MarcGravell 正如我在 xml 代码中所写,xml 的大小约为 10000 行。我正在阅读放入 List. 的 xml e XmlDocument 出现什么问题?你试过 XmlSerializer 吗? XElement? @MarcGravell 问题是我需要在内存中保存这个对象列表,它们大约是 10000。正如我在这篇文章中看到的 nearinfinity.com/blogs/joe_ferner/…,XmlReader 的性能更好 @MarcGravell 问题出在 Ram 和 PC 上。它们是(大部分)具有 512 Mb Ram 专用的虚拟机,我会提高性能。 【参考方案1】:

如果您对 xml 文件执行只读操作,那么您可以使用 XmlReader,但正如 @Marc Gravell 指出的那样,这很困难。

在这种情况下,我将创建一个使用XmlReader 包装XPathDocument 的类。然后我创建一个XPathNavigator 来读取数据。这是一个例子:

public class MyXmlReader

    public MyXmlReader(string xml)
    
        StringReader sReader = new StringReader(xml);

        XPathDocument xml = new XPathDocument(XmlReader.Create(sReader));

        xmlNav = xml.CreateNavigator();
    

    private XPathNavigator xmlNav = null;


    public MyDataModel ReadMyDataModel()
    
        MyDataModel model = new MyDataModel();

        model.Read(xmlNav);

        return model;
    

如上所示,数据的读取然后可以封装到关联的对象模型中。您可以在我对这个问题的回答中看到一些细节:

How do I manipulate an XML document one parent element at a time?

【讨论】:

好的,如果您还有其他问题,请告诉我。我经常使用这种方法对 xml 文件进行只读访问。【参考方案2】:

你可以使用

XmlReader xmlReader = new XmlNodeReader(xmlDoc);

见:http://blog.jongallant.com/2007/01/convert-xmldocument-to-xmlreader.html

【讨论】:

很遗憾链接已损坏

以上是关于从 XmlDocument 到 XmlReader .Net的主要内容,如果未能解决你的问题,请参考以下文章

使用XmlDocument时跳过DTD验证

xmlreader与xmlwriter里的几个坑与解决方案

c# 中,如何读取XML文件,并将读取到的内容显示到TreeView中

C#将多个XMLNode或XMLNodeList从一个XMLDocument复制到另一个XMLDocument

如何将 XmlNode 从一个 XmlDocument 复制到另一个?

XmlDocument.Save 从 GC 线程抛出的未处理异常