XPath选择多个元素

时间:2017-06-13 10:35:31

标签: xml xpath pentaho-spoon

我有一个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

我该怎么做?

3 个答案:

答案 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表达式的位置:

  1. Loop XPath(内容选项卡)用于通过返回节点列表从文档中派生行。
  2. Field XPath(字段选项卡)用于填充行的字段。
  3. 如果您的文档包含不同级别的多个节点列表,则最好以最深的列表为目标。使用轴或..运算符可以轻松访问祖先信息。

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

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