从XmlDocument到XmlReader的.NET转换

22

在我的问题得到某个用户的建议后,我正在尝试将我的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) 
           ?????

1
尝试使用XmlReader(健壮地)读取xml其实很困难。你想要做什么?你的目标是什么?xml的大小是多少? - Marc Gravell
@MarcGravell,XML的大小是我在XML代码中写的约10000行。我正在读取一个XML并将其放入List<Link>中。 - user1107078
XmlDocument有什么问题?你试过XmlSerializer吗?或者XElement呢? - Marc Gravell
@MarcGravell,问题是我需要在内存中保留这个对象List<Link>,它们大约有10000个。正如我在这篇文章http://www.nearinfinity.com/blogs/joe_ferner/performance_linq_to_sql_vs.html中所读到的,使用XmlReader的性能更好。 - user1107078
问题在于内存和电脑。它们大多数是512 MB内存的虚拟机,我想增加性能。 - user1107078
2个回答

83

很遗憾,链接已经失效。 - Roman Marusyk

8

如果您只对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;
    }
}

如上所示,数据的读取可以封装到相关联的对象模型中。您可以在我的答案中看到一些详细信息:如何逐个操作XML文档中的父元素?

好的,如果您有任何问题,请告诉我。我经常使用这种方法来只读访问XML文件。 - dblood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接