【问题标题】:Get specific values from XML with ID values从 XML 中获取具有 ID 值的特定值
【发布时间】:2017-05-18 12:02:02
【问题描述】:

我有下一个 XML 文件:

<root>
    <location id='IBM'>
        <property name='locale' value='en-EN' />
        <property name='path' value='c:\program files\IBM' />
        <property name='option' value='licence' />
        <package kind='offering' name='IBM tools'>
            <property name='cic.name' value='IBM Studio'/>
            <property name='cic.version' value='13.4'/>
        </package>
    </location>
    <location id='Microsoft'>
        <property name='locale' value='en-EN' />
        <property name='path' value='c:\program files\MS' />
        <property name='option' value='licence' />
        <package kind='offering' name='Microsoft'>
            <property name='cic.name' value='Windows XP'/>
            <property name='cic.version' value='10.3.2'/>
        </package>
    </location>
</root>

如何从 XML 结构中的 cic.name 和 cic.version 获取这些值:

IBM 工作室 13.4 视窗 10.3.2

我试过了

XElement roots = XElement.Load(@"C:\test.xml");

foreach (var i in roots.Descendants("location"))
{
   Console.WriteLine(i.Attribute("id").Value);
}

但我只得到: IBM 微软

谢谢!

【问题讨论】:

  • 这不是有效的 XML。它有两个根元素,一些“属性”节点错过了结束标记。
  • 我知道,我只是复制了整个文档的几行。

标签: c# xml linq linq-to-xml xelement


【解决方案1】:

解决办法

var doc = XDocument.Load(yourXmlFilePath);

var packages = doc.Descendants("package")
                .Select(p => new
                {
                    Name = p.Elements("property")
                            .SingleOrDefault(i => i.Attribute("name")?.Value == "cic.name")
                            ?.Attribute("value")
                            ?.Value,
                    Version = p.Elements("property")
                               .SingleOrDefault(i => i.Attribute("name")?.Value == "cic.version")
                               ?.Attribute("value")
                               ?.Value
                }).ToList();

var result = names.Select(i => string.Format("{0} {1}", i.Name, i.Version)).ToList();

//result: "IBM Studio 13.4"
//        "Windows XP 10.3.2"

【讨论】:

  • 我得到 Object reference not set to an instance of an object 错误。我做错了什么?
  • 如果您发布实际的 xml 文件,我们可能会为您提供帮助。
【解决方案2】:

您的代码仅在 location 元素上查找 id 属性。

如果您需要 cic.namecic.version 值,则必须在查询中包含这些值。

var results =
    from package in doc.Descendants("package")
    select new
    {
        Name = (string) package.Elements("property")
            .Where(x => (string) x.Attribute("name") == "cic.name")
            .Attributes("value")
            .Single(),
        Version = (string) package.Elements("property")
            .Where(x => (string) x.Attribute("name") == "cic.version")
            .Attributes("value")
            .Single(),
    };

请参阅this fiddle 以获取演示。

【讨论】:

    【解决方案3】:

    试试这样的

    foreach (var Locations in roots.Descendants("location"))
    {
        foreach (var item in Locations.Descendants("package"))
        {
            Console.WriteLine(item.Attribute("id").Value);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多