选择“使用 linq to xml 查询的元素”

本文关键字:查询 元素 xml to 使用 linq 选择 | 更新日期: 2023-09-27 18:34:24

需要从 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"/>

尝试使用以下查询,但它也在获取我不想要的操作名称

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

对此有什么想法吗?

选择“使用 linq to xml 查询的元素”

如果您只想要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<XElement>IEnumerable<object[]>

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

XNamespace ns = "http://docs.openstack.org/compute/api/v1.1";
var elements = doc.Descendants(ns + "server").ToList();