Xpath查询多属性选择

时间:2013-12-05 20:29:29

标签: xml xpath

我的XML看起来像这样:

<device-attributes>
<devices>
<!--
    Devices
-->
    <device ipaddr="192.37.99.82" dtype="Linux" site="ELROND" node="ELROND-LC3">
        <Importance>
            <Value>
                1
            </Value>
        </Importance>
        <Vulnerability>
            <Value>
                1
            </Value>
        </Vulnerability>
        <Properties>
            <ResolvedName>
                Fake.Domain.Title.com
            </ResolvedName>
        </Properties>
        <CMDB>
            <HPSM_CI_ID>
                CI146826
            </HPSM_CI_ID>
            <HPSM_CI_COMMON_NAME>
                FakeName
            </HPSM_CI_COMMON_NAME>
        </CMDB>
    </device>
</devices>

这是一个片段(有500,000多行类似数据),但基本上我要做的就是获取设备标签和HPSM_CI_ID数据中的信息。

例如:

192.37.99.82,Linux和ELROND,ELROND-LC3,CI146826

这是我当前的XPath查询:

//devices/device[@ipaddr] | //HPSM_CI_ID

但这甚至不会返回设备标签中的IP(试图找出那部分,以便我可以将它应用于标签的所有部分)。

奖金问题:XPath是否有办法从父查询中拆分每个结果?

例如:

192.168.0.1,Linux,ELROND,ELROND-LC3,CI41563 | 102.41.51.52,窗户,ELROND,ELROND-LC3,CI24783

这会使解析数据变得容易得多,但我无法弄清楚这是否可行。

1 个答案:

答案 0 :(得分:0)

你的XPath很接近但只是需要稍微调整一下。目前,@ipaddr位于您的谓词中,这意味着您实际上正在查看属性为device的{​​{1}},而不是找到@ipaddr的实际值。

因此获取该值的XPath将是:

@ipaddr

但是,如果您想要每个属性,可以将其更改为:

//devices/device/@ipaddr

然后你的其他元素的XPath将是:

//devices/device/@*

虽然如果您没有从正在使用的应用程序中获取正确的元素,但您可能希望尝试使用之前搜索中的//devices/device/CMDB/HPSM_CI_ID 来获取正确的元素:

@ipaddr

这样可以获得与//devices/device[@ipaddr='192.37.99.82']/CMDB/HPSM_CI_ID 匹配的HPSM_CI_ID的具体device