C# 从具有ID值的XML中获取特定值
我有下一个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
<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);
}
}