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(*)]
将检索示例中的所有数据元素。
卡在了一个奇怪的场景中。我需要解析传入的 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(*)]
将检索示例中的所有数据元素。