Linq to XML 根据属性检索值
Linq to XML to retrieve value based on Attribute
我有一个 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 查询,用于尝试从 "name/narrative" 中检索值,其中有一个 "xml:lang='fr'" 属性:
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 的值吗?
谢谢
您可以将 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 字符串参数的重载时抱怨)。
我有一个 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 查询,用于尝试从 "name/narrative" 中检索值,其中有一个 "xml:lang='fr'" 属性:
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 的值吗?
谢谢
您可以将 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 字符串参数的重载时抱怨)。