我有一个XML,如下所示:
<managedObject class="SUBRACK" version="1.0" distName="xxxx-xxxx/BSC-2222/xxx-102/xxx-1/xx-1" id="2222">
<p name="locationName">000000-000</p>
<p name="subrackSpecificType">xxxx</p>
<p name="vendorName">xxxx</p>
<p name="version">01</p>
</managedObject>
<managedObject class="UNIT" version="1.0" distName="x1-X2/XXX-111111/YYY-102/ZZ-1/AAAA-1/BBBB-CCC_2_3" id="55555">
<list name="availabilityStatus">
<p>Power On</p>
</list>
<p name="identificationCode">9999A</p>
<p name="operationalState">1</p>
<p name="position">1</p>
<p name="serialNumber">8888B</p>
<p name="unitId">1</p>
<p name="unitType">HHHH</p>
<p name="vendorName">AAAA</p>
<p name="version">333</p>
</managedObject>
我希望XPath选择所有 p name 及其值。
我可以使用
获得其他值@class - 获取课程
@version - 获取版本
[name()='list'] / [name()='p'] - 获取“开机”
* [name()='p'] / @ name - 获取 identificationCode (第一个名称)
* [name()='p'] - 获取 identificationCode 的值 - 9999A
与前两个字段类似,我想使用XPath获取其余元素:
operationalState - 1
位置 - 1
serialNumber - 8888B
unitId - 1
。
。
我该怎么做?
答案 0 :(得分:0)
您可以尝试按照xpath检索任何&#34; p&#34; xml中的元素,具有特定的&#34; name&#34;属性,无论它位于xml中的哪个位置。
//p[@name='unitType']
这里//
是后代或自我。只需将上面xpath中的unitType字符串替换为所需的字符串。
以上xpath选择的输出将是
<p name="unitType">HHHH</p>
答案 1 :(得分:0)
如果您想从所有p
元素获取所需数据而未指定每个name
属性值,则可以使用
//list/following-sibling::p[@name]
或
//*[name()="list"]/following-sibling::*[name()="p" and @name]
如果您想要name
属性值和文本内容p
:
//list/following-sibling::p[@name]/@name | //list/following-sibling::p[@name]
答案 2 :(得分:0)
在步骤Get-Data-From-XML中有两个指定XPath表达式的位置:
如果您的文档包含不同级别的多个节点列表,则最好以最深的列表为目标。使用轴或..
运算符可以轻松访问祖先信息。
当字段XPath返回节点列表时,Kettle将始终选择第一个项而不是中止。
显然,您必须使用//p
作为Loop XPath。