迭代XML的所有节点并解析存储在attribute中的值

时间:2018-04-08 20:43:39

标签: c# xml

我正在尝试迭代xml文件的所有节点,并解析存储在名为“product”的节点的“product-id”属性中的值。

我的代码看起来像这样。

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Linq;

class ReadFileFromFolder
{
    public static void Main()
    {
        XDocument xdoc = XDocument.Load("catalog.xml");

        foreach (XElement element in xdoc.Descendants())
        {
            if(element.Name == "product")
            {
                Console.WriteLine(element.Attributes["product-id"].Value);;   
            }
        }
    }
}

我得到的错误

  

projects / DotNetProjects / FilterProducts / FilterProducts / FilterProducts / ReadFileFromFolder.cs(35,35):错误CS0021:无法将[]索引应用于“方法组”类型的表达式(CS0021)(过滤产品)

超级新c#所以可能是我正在做的傻事。

3 个答案:

答案 0 :(得分:1)

使用Linq-to-Xml可以简单到:

XDocument xdoc = XDocument.Load("catalog.xml");
var productids = xdoc.Descendants("product").Select(p => p.Attribute("product-id").Value);

答案 1 :(得分:1)

'方法组'表示对象的类型至少有一个具有该名称的方法。在术语中使用组,因为方法名称可以重载。 '[]'只能用于索引字段和属性。

ReadFileFromFolder.cs(35,35)表示转到第35行第35列,以获取错误的尽力而为位置。在许多工具中,双击错误消息将带您到那里。

您使用'[]'的地方是属性标识符。如果你查看文档(F1)或声明(F12),你会发现它实际上是一个带有一个签名(没有重载)的方法组。所以,用'()'来称呼它。

答案 2 :(得分:0)

尝试使用“(”)来访问属性,这会导致错误。请尝试以下

class ReadFileFromFolder
    {
        public static void Main()
        {
            XDocument xdoc = XDocument.Load("catalog.xml");
            foreach (XElement element in xdoc.Descendants())
            {
                if(element.Name == "product"){
                    Console.WriteLine(element.Attributes("product-id").Value);;   
                }
            }
        }
    }