繁体   English   中英

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 (当我使用仅接受XPath字符串参数而没有名称空间管理器的重载时,会抱怨XPathSelectElement() )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM