Xpath 获取单个元素以及所有子元素

Xpath to fetch single Elements as well all sub elemnts

卡在了一个奇怪的场景中。我需要解析传入的 XML 文件并将其切碎到数据库中。 我正在使用 Pentaho Kettle 的 'Get XML Data' 组件。 我的循环 Xpath 是: readable/trans/header///*

样本数据为

 <readable>
    <trans>
       <header>
          <single>Data1</single>
          <A>
             <A1>DATA</A1>
            <A2>DATA</A2>   
         </A>
         <A>
            <A3>DATA</A3>
            <A4>DATA</A4>   
         </A>
         <B>
            <B1>DATA</B1>
            <B2>DATA</B2>
               <C>
                   <C1>data</C1>
                   <C2>data</C2>
               </C>
         </B>

      </header> 
   </trans>
</readable>

可以看出,元素C的深度是最大的,并不是到处都有。它可以随机出现在某些元素中。 基于此,为了覆盖所有元素直到深度 C,My Xpath 分为三个级别。

但现在的问题是我无法获取单个元素的值。

Name                               XPATH                       Sample Value fetched

TAG_value                           .                            data

TAG_NAME                           name(.)                        C1

TAG_PARENT_NAME                   name(../.)                      C

如何分别获取 "B1" 和 "B2" 的值,这些值属于 "B" 但高于 "C".

基本上,如何获取

<B1>DATA</B1>
<B2>DATA</B2> 

请记住,我们应该有一个 'loop Xpath',正如我上面提到的,借助它我应该能够获取所有值,因为我需要将 XML 切碎到数据库中。 在此先感谢大家。

您的要求有点不清楚,这里有一些可能的解决方案。

如果您事先知道整个文档的结构和这些元素的名称:

/readable/trans/header/B/*[self::B1 or self::B2]

如果您不知道文档的结构,但知道目标元素的名称:

//*[self::B1 or self::B2]

如果您知道文档的结构,但不知道目标元素的名称,但知道它们必须是 B 元素的直接子元素,而不能是 C元素:

/readable/trans/header/B/*[not(self::C)]

所有那些表达式return相同的结果,即(个别结果由-------分隔)

<B1>DATA</B1>
-----------------------
<B2>DATA</B2>

Loop XPath readable/trans/header//*[not(*)] 将检索示例中的所有数据元素。