陷入一种奇怪的情况。我需要解析传入的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分解为数据库。 感谢提前,伙计。
答案 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(*)]
将检索示例中的所有数据元素。