C# 从具有ID值的XML中获取特定值

C# 从具有ID值的XML中获取特定值,c#,xml,linq,linq-to-xml,xelement,C#,Xml,Linq,Linq To Xml,Xelement,我有下一个XML文件: <root> <location id='IBM'> <property name='locale' value='en-EN' /> <property name='path' value='c:\program files\IBM' /> <property name='option' value='licence' /> <pac

我有下一个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>
但我只得到: 国际商用机器公司 微软

谢谢大家!

这是解决方案

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"

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

如果需要
cic.name
cic.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(),
    };

请参阅以获取演示。

尝试类似的方法

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

}

这是无效的XML。它有两个根元素,一些“属性”节点缺少结束标记。我知道,我只是复制了整个文档的几行。我得到的对象引用没有设置为对象错误的实例。我做错了什么?如果您发布实际的xml文件,我们可能会帮助您。
foreach (var Locations in roots.Descendants("location"))
{
    foreach (var item in Locations.Descendants("package"))
    {
        Console.WriteLine(item.Attribute("id").Value);
    }

}