select 多个元素的 XPath
XPath to select multiple elements
我有一个 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 select 所有 p 名称 及其值。
我可以使用获得其他值:
@class - 得到 class
@version - 获取版本
.
.
[name()='list']/[name()='p'] - 到得到 "Power On"
*[name()='p']/@name - 获取 identificationCode (first p name)
*[name()='p'] - 获取 identificationCode 的值 - 9999A
类似于最后两个字段,我想使用XPath获取其余元素:
操作状态 - 1
位置 - 1
序列号 - 8888B
unitId - 1
。 .
。
.
我该怎么做?
您可以尝试按照 xpath 检索 xml 中具有特定 "name" 属性的任何 "p" 元素,无论其位于 xml.
中的什么位置
//p[@name='unitType']
这里//
是后代或自己。只需将上面 xpath 中的 unitType 字符串替换为所需的字符串即可。
以上 xpath 选择的输出将是
<p name="unitType">HHHH</p>
如果您想从所有 p
元素中获取所需数据而不指定每个 name
属性值,您可以使用
//list/following-sibling::p[@name]
或
//*[name()="list"]/following-sibling::*[name()="p" and @name]
如果您想要 p
的 name
属性值和文本内容:
//list/following-sibling::p[@name]/@name | //list/following-sibling::p[@name]
您在步骤 Get-Data-From-XML 中指定 XPath 表达式的位置有 2 个:
- 循环 XPath(内容选项卡)旨在通过返回节点列表从文档中派生行。
- 字段 XPath(字段选项卡)用于填充行的字段。
如果您的文档包含多个不同级别的节点列表,最好瞄准最深的列表。使用坐标轴或 ..
运算符可以轻松访问祖先信息。
当字段 XPath returns 是节点列表时,Kettle 将始终选择第一项而不是中止。
显然,您必须使用 //p
作为循环 XPath。
我有一个 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 select 所有 p 名称 及其值。
我可以使用获得其他值:
@class - 得到 class
@version - 获取版本
.
.
[name()='list']/[name()='p'] - 到得到 "Power On"
*[name()='p']/@name - 获取 identificationCode (first p name)
*[name()='p'] - 获取 identificationCode 的值 - 9999A
类似于最后两个字段,我想使用XPath获取其余元素:
操作状态 - 1
位置 - 1
序列号 - 8888B
unitId - 1
。 .
。 .
我该怎么做?
您可以尝试按照 xpath 检索 xml 中具有特定 "name" 属性的任何 "p" 元素,无论其位于 xml.
中的什么位置//p[@name='unitType']
这里//
是后代或自己。只需将上面 xpath 中的 unitType 字符串替换为所需的字符串即可。
以上 xpath 选择的输出将是
<p name="unitType">HHHH</p>
如果您想从所有 p
元素中获取所需数据而不指定每个 name
属性值,您可以使用
//list/following-sibling::p[@name]
或
//*[name()="list"]/following-sibling::*[name()="p" and @name]
如果您想要 p
的 name
属性值和文本内容:
//list/following-sibling::p[@name]/@name | //list/following-sibling::p[@name]
您在步骤 Get-Data-From-XML 中指定 XPath 表达式的位置有 2 个:
- 循环 XPath(内容选项卡)旨在通过返回节点列表从文档中派生行。
- 字段 XPath(字段选项卡)用于填充行的字段。
如果您的文档包含多个不同级别的节点列表,最好瞄准最深的列表。使用坐标轴或 ..
运算符可以轻松访问祖先信息。
当字段 XPath returns 是节点列表时,Kettle 将始终选择第一项而不是中止。
显然,您必须使用 //p
作为循环 XPath。