我有一个Linq to Xml查询,需要根据特定节点的属性值检索值。我试图检索项目列表,其中一个节点有一个我无法找到获取价值的方法的属性。 这是XML:
<codelist-items>
<codelist-item>
<code>1</code>
<name>
<narrative>Planned start</narrative>
<narrative xml:lang="fr">Début prévu</narrative>
</name>
<description>
<narrative>
The date on which the activity is planned to start, for example the date of the first planned disbursement or when physical activity starts.
</narrative>
</description>
</codelist-item>
<codelist-item>
<code>2</code>
<name>
<narrative>Actual start</narrative>
<narrative xml:lang="fr">Début réel</narrative>
</name>
<description>
<narrative>
The actual date the activity starts, for example the date of the first disbursement or when physical activity starts.
</narrative>
</description>
</codelist-item>
</codelist-items>
我只显示2个项目以保持简短。这是我的Linq查询尝试从&#34; name / narrative&#34;中检索值。哪里有一个&#34; xml:lang =&#39; fr&#39;&#34;属性:
XElement xelement = XElement.Load(xmlFile);
var elements = from adt in xelement.Elements("codelist-items").Elements("codelist-item")
select new ActivityDateType
{
Code = (string)adt.Element("code"),
NameEng = (string)adt.Element("name").Element("narrative"),
NameFra = (string)adt.Element("name").Element("narrative[@xml:lang='fr']"),
Description = (string)adt.Element("description")
};
return elements;
任何人都知道如何获取NameFra的值?
由于
答案 0 :(得分:0)
您可以使用带有谓词的LINQ FirstOrDefault()
,该谓词按其属性值过滤元素:
NameFra = (string)adt.Element("name")
.Elements("narrative")
.FirstOrDefault(o => (string)o.Attribute(XNamespace.Xml+"lang") == "fr"),
或使用XPathSelectElement()
扩展名来执行已包含属性过滤逻辑的XPath表达式:
NameFra = (string)adt.Element("name")
.XPathSelectElement("narrative[@xml:lang='fr']", nsmgr),
后者可以进一步简化为以下内容:
NameFra = (string)adt.XPathSelectElement("name/narrative[@xml:lang='fr']", nsmgr),
假设 nsmgr
以前被宣布为:
var nsmgr = new XmlNamespaceManager(new NameTable());
nsmgr
是必需的,因为XPath包含前缀xml
(XPathSelectElement()
在我使用只接受没有名称空间管理器的XPath字符串参数的重载时抱怨。