【问题标题】:Get a list of ID Attributes from an XML File C#从 XML 文件 C# 中获取 ID 属性列表
【发布时间】:2020-09-11 12:09:18
【问题描述】:

我正在尝试从下面的 xml 文件中获取服务 ID 列表。

  <Settings>
<SomeTag>Some inner text</SomeTag>
<Services ID="Downtown Location">
    <Service ID="22923">Basic</Service>
    <Service ID="22926">Basic + 2</Service>
    <Service ID="22927">Basic + 3</Service>
    <Service ID="22928">Basic + 4</Service>
    <Service ID="22929">Basic + 5</Service> 
</Services>
<MoreTags>
    <ATag></ATag>
    <ATag></ATag>
    <ATag></ATag>
    <ATag></ATag>
</MoreTags>
</Settings>

我尝试了几种我在网上找到的方法,但每种方法都有一些问题。这是我最后一次尝试。

          List<string> ServiceList = new List<string>();
            XmlDocument xdoc = new XmlDocument();
            xdoc.Load(AppDomain.CurrentDomain.BaseDirectory + @"\Settings.xml");
            XmlNodeList nodes = xdoc.DocumentElement.SelectNodes("/Services/Service");
            foreach (XmlNode node in nodes)
            {
                ServiceList.Add(node.Attributes["ID"].Value);
            }
            return ServiceList; 

在这种情况下,节点没有项目。我已经尝试了 SelectNodes 的几种变体,但仍然没有项目。早些时候,我尝试过 XDocument 和 LINQ 查询。我更愿意这样做,但我还没有找到收集 ID 的示例。

【问题讨论】:

  • 您共享的 C# 代码将始终返回一个空列表,因为您从未向 ServiceList 添加任何内容。
  • 谢谢卢克。我在此示例中更改了名称,并没有在循环中更改它。但是,节点仍然是空的。 ServiceList 不会包含任何内容,因为节点中没有任何内容。

标签: c# xml linq


【解决方案1】:

首先,我认为您错过了关闭的“设置”标签是一个错字。要使用 Linq to Xml 捕获 ID,您可以使用。

XElement xmlNode = XElement.Load(filePath);
var result = xmlNode.Descendants("Service").Select(x=>x.Attribute("ID").Value);

样本输出

【讨论】:

  • 也谢谢你,阿努。我和我看到的第一个一起去了。但我也尝试了你的答案。不幸的是,我不能同时选择两者作为答案。
【解决方案2】:

这是System.Xml.Linq 的示例:

static void Main(string[] args)
{
    var xmldoc = System.Xml.Linq.XDocument.Load(@"YOUR FILE");

    foreach (var name in xmldoc.Descendants("Services").Elements()
                        .Select(x => new { Name = x.Name, Value = x.Value, ID=x.Attribute("ID")
                       }))
    {       
       Console.WriteLine(name.ID.Value);
    }

    Console.ReadLine();
}

输出:

22923
22926
22927
22928
22929

【讨论】:

  • 谢谢@jonathana!因此,您的 LINQ 语句创建了一个对象并将每个服务标签的值分配给该对象,然后将该对象的属性分配给列表。好吧,在您的情况下,将其写入控制台。我没看到。
【解决方案3】:

修复方法是删除此行 XPath 表达式中的前导 /

            XmlNodeList nodes = xdoc.DocumentElement.SelectNodes("/Services/Service");

给你

            XmlNodeList nodes = xdoc.DocumentElement.SelectNodes("Services/Service");

/ 开头的XPath 表达式从文档的根开始搜索匹配的元素。但是,您已导航到文档元素并希望从那里开始搜索。

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多