XPATH选择父节点和子节点

时间:2017-06-30 10:50:27

标签: xml xpath

我有以下xml文件,其中我想使用XPATH选择主机名,实例名称,实例类型

<root>
<hosts>
    <host id="11">
        <name>ABC</name>
        <instances>
            <instance id="11-1">
                <name>raj</name>
                <type>linux</type>
                <date>2017</date>
            </instance>
            <instance id="11-2">
                <name>raj1</name>
                <type>linux</type>
                <date>2017</date>
            </instance>
        </instances>
    </host>
    <host id="12">
        <name>XYZ</name>
        <instances>
            <instance id="12-1">
                <name>rahul</name>
                <type>solaris</type>
                <date>2017</date>
            </instance>
        </instances>
    </host>
</hosts>
</root>

我在XPATH下面尝试过选择实例名称和类型但不确定如何打印主机名以及实例名称和类型。

//hosts/host/instances/instance/*[self::name or self:: type]/text()

选择以下结果。

    raj
    linux
    raj1
    linux
    rahul
    solaris

但是,我想要包含主机名的输出如下所示

    ABC
    raj
    linux
    raj1
    linux
    XYZ
    rahul
    solaris

3 个答案:

答案 0 :(得分:2)

以下(使用|运算符组合由三个查询中的任何一个选择的元素集)将执行以下操作:

  //hosts/host[./instances/instance/name or ./instances/instance/type]/name/text()
| //hosts/host/instances/instance/name/text()
| //hosts/host/instances/instance/type/text()

答案 1 :(得分:1)

如果您还要包含hostname的输出,请尝试以下操作:

//hosts/host//*[self::name or self:: type]/text()

答案 2 :(得分:1)

您可以使用以下任何一种解决方案来实现您想要的结果 -

解决方案 - 1(完整路径) - 您可以跳过root:

/ root / hosts / host / name [text()] | / root / hosts / host / instances / instance / * [self :: name or self :: type]

解决方案 - 2(完整路径),每个结果都有单独的查询:

/ root / hosts / host / name [text()] | / root / hosts / host / instances / instance / name [text()] | / root / hosts / host / instances / instance / type [text( )]

解决方案 - 3(节点路径)

// host / name [text()] | // instance / * [self :: name |自::型]

解决方案 - 4(节点路径)

// host / [self :: name] | // instance / [self :: name |自::型]

希望以上是有帮助的。