使用linq to xml查询选择元素

时间:2014-12-17 09:40:15

标签: c# xml linq

需要捕获xml标记OperationName中的所有元素,不包括OperationName标记本身,即

<testdata>
<EPPublicCall>
    <OperationName>
        <server xmlns="http://docs.openstack.org/compute/api/v1.1" imageRef="3afe97b2-26dc-49c5-a2cc-a2fc8d80c001" flavorRef="2" name="api-test-server-xml2"/>
    </OperationName>
    <OperationType>Public</OperationType>
</EPPublicCall>

需要取下面

<server xmlns="http://docs.openstack.org/compute/api/v1.1" imageRef="3afe97b2-26dc-49c5-a2cc-a2fc8d80c001" flavorRef="2" name="api-test-server-xml2"/>

尝试使用以下查询,但它也提取了我不想要的OperationName

var doc = XDocument.Load("C:\\TestData.xml");
        return
            from vars in doc.Descendants("EPPublicCall")
            let operationName = vars.Elements("OperationName")
            select new object[] { operationName };

对此有何想法?

2 个答案:

答案 0 :(得分:1)

如果您只想要OperationName的直接后代而不知道它们是什么,那么简单地在可枚举的XElements上添加对.Elements()方法的调用,不带参数:

return
    from vars in doc.Descendants("EPPublicCall")
    let operationName = vars.Elements("OperationName")
    select new object[] { operationName.Elements() };

或者,如果你想要一个更简单的返回对象:

return doc.Descendants("EPPublicCall").Elements("OperationName").Elements();

将以IEnumerable<XElement>而不是包含IEnumerable<object[]>的{​​{1}}来解析。

答案 1 :(得分:0)

您可以通过指定命名空间来使用Descendants方法:

XNamespace ns = "http://docs.openstack.org/compute/api/v1.1";

var elements = doc.Descendants(ns + "server").ToList();