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]

如果您想要 pname 属性值和文本内容:

//list/following-sibling::p[@name]/@name | //list/following-sibling::p[@name]

您在步骤 Get-Data-From-XML 中指定 XPath 表达式的位置有 2 个:

  1. 循环 XPath(内容选项卡)旨在通过返回节点列表从文档中派生行。
  2. 字段 XPath(字段选项卡)用于填充行的字段。

如果您的文档包含多个不同级别的节点列表,最好瞄准最深的列表。使用坐标轴或 .. 运算符可以轻松访问祖先信息。

当字段 XPath returns 是节点列表时,Kettle 将始终选择第一项而不是中止。

显然,您必须使用 //p 作为循环 XPath。