Linq to XML基于Attribute检索值

时间:2016-05-26 19:43:22

标签: c# xml xpath asp.net-web-api linq-to-xml

我有一个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的值?

由于

1 个答案:

答案 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包含前缀xmlXPathSelectElement()在我使用只接受没有名称空间管理器的XPath字符串参数的重载时抱怨。