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

时间:2017-02-09 12:43:26

标签: xpath pentaho kettle

陷入一种奇怪的情况。我需要解析传入的XML文件并将其粉碎到数据库中。 我正在使用Pentaho Kettle的“获取XML数据”组件。 我的循环Xpath是:  可读式/反式/报头/ / / *

示例数据

 <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,我的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> 

请记住,如上所述,我们应该有单个'循环Xpath',借助它我可以获取所有值,因为我需要将XML分解为数据库。 感谢提前,伙计。

2 个答案:

答案 0 :(得分:1)

您的要求有点不清楚,以下是一些可能的解决方案。

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

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

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

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

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

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

所有这些表达式都返回相同的结果,即(单个结果由-------分隔)

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

答案 1 :(得分:1)

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