如何获取xpath以获取以下xml

时间:2018-03-30 13:42:57

标签: xml xpath

<DeviceProfile xmlns="http://www.hp.com/schema/m2m/">
    <Metadata>
        <DeviceProfileType>HPIOT</DeviceProfileType>
        <OntologyReference xmlns:tns="http://www.yyy.com/schema/m2m/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
            <AssetParams ParamName="Device-ID" DisplayName="Device-ID" Mandatory="true" ReadOnly="true" DataType="String" Category="IoT" LiveUpdate="false" xpath="'Unit-ID''" Decoding="none" MinLength="1" />
            <AssetParams ParamName="deviceHost" DisplayName="Device Host" Mandatory="false" ReadOnly="false" DataType="String" Category="IoT" Decoding="none" />
            <AssetParams ParamName="devicePort" DisplayName="Device Port" Mandatory="false" ReadOnly="false" DataType="number" Category="IoT" Decoding="none" />
            <AssetParams ParamName="deviceMSISDN" DisplayName="Device MSISDN" Mandatory="true" ReadOnly="false" DataType="number" Category="IoT" Decoding="none" />
            <AssetParams ParamName="preferredProtocol" DisplayName="Preferred Protocol" Mandatory="true" ReadOnly="false" DataType="Choice" Category="IoT" Decoding="none" ChoiceElements="TCP,UDP" />
    </Metadata> 
</DeviceProfile>

在上面的xml代码中,获取所有AssetParam属性的XPath表达式是什么?

为什么没有//AssetParams工作?

2 个答案:

答案 0 :(得分:1)

使用此(不关心名称空间):

'//@DisplayName | //@Device-ID | //@Mandatory | //@ReadOnly | //@DataType | //@Category | //@LiveUpdate | //@xpath | //@Decoding | //@MinLength'

答案 1 :(得分:1)

您的XPath正在尝试选择未绑定到任何命名空间并具有local-name() AssetParams的元素。

很容易忽略,但所有元素都绑定到命名空间。

DeviceProfile元素上:xmlns="http://www.hp.com/schema/m2m/"表示它及其后代绑定到该命名空间。如果使用了名称空间前缀,那将更加明显。

您没有指定用于执行XPath的内容,或者它支持的版本。

XPath 1.0表达式将匹配任何元素,然后在谓词中,按local-name()

进行过滤
//*[local-name()='AssetParams']

使用XPath 2.0(及更高版本),您可以使用通配符作为命名空间:

//*:AssetParams