【问题标题】:C# XmlReader - shorter function [closed]C# XmlReader - 更短的函数
【发布时间】:2014-01-08 18:23:45
【问题描述】:

我编写了读取我的 XML 文件的函数。我可以写得更通用更短吗?

我的功能:

XmlTextReader reader = new XmlTextReader ("../../database.xml");
    reader.ReadStartElement("eshop");
    while (reader.Read ()) {
        if (reader.IsStartElement ()) {

            reader.ReadStartElement("item");
            reader.ReadStartElement ("id");
            string elem = reader.ReadString ();
            reader.ReadEndElement ();
            reader.ReadStartElement ("name");
            string name = reader.ReadString ();
            reader.ReadEndElement ();
            reader.ReadStartElement ("cost");
            string cost = reader.ReadString ();
            reader.ReadEndElement ();

            Console.WriteLine (elem + " - name  : " + name + " - cost: " + cost);
        }

    }

示例 XML:

<?xml version="1.0" encoding="UTF-8" ?>
<eshop>
    <item>
        <id>1</id>
        <name>some product 1</name>
        <cost>89.90</cost>
    </item>
    <item>
        <id>2</id>
        <name>some product 2</name>
        <cost>95.00</cost>
    </item>
    <item>
        <id>3</id>
        <name>some product 3</name>
        <cost>12.00</cost>
    </item>
</eshop>

如果我将新元素添加到 .现在,如果我想将我的 xml 文件升级到其他元素,我必须添加此功能:

    reader.ReadStartElement ("secondelement");
    string secondelement = reader.ReadString ();
    reader.ReadEndElement ();

请帮忙。谢谢。

【问题讨论】:

  • 这个问题似乎是题外话,因为它是关于重构一个工作代码示例。考虑在 Code Review 上发帖。

标签: c# xml parsing xmlreader


【解决方案1】:

读取XML最简单的方法不是使用XmlReader,而是使用LINQ to XML(使用System.Xml.Linq):

var d = XDocument.Load("../../database.xml");

foreach (var e in d.Root.Elements("item"))
{
    Console.WriteLine(
        (string)e.Element("id") + 
         " - name  : " + (string)e.Element("name") +
         " - cost: " + (string)e.Element("cost"));
}

【讨论】:

    【解决方案2】:

    看看XDocument类:

    http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument(v=vs.110).aspx

    然后您应该能够使用 LINQ 读取特定元素/属性。

    类似的问题:

    LINQ to read XML

    【讨论】:

      【解决方案3】:

      是的,您可以使用 LINQ to XML:

      XDocument xDoc = XDocument.Load("../../database.xml");
      
      foreach(var item in xDoc.Descendants("item"))
      {
         string id= (string)item.Element("id");
         string name= (string)item.Element("name");
         string cost= (string)item.Element("cost");
         Console.WriteLine("{0} name - {1} - cost {2}",id,name,cost);
      }
      

      【讨论】:

      • 这太棒了 - 就像在 PHP 中一样 - 更具可读性和易记性。谢谢你,感谢迈克的帮助。现在是学习 LINQ 的时候了 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多