java - 使用 xpath 根据另一个属性的值检索属性值

标签 java xml xslt xpath xquery

我有以下 xml 文档:

<database>

<order>
    <data>
        <field name="time" value="10:10:10" />
    </data>
    <data>
        <field name="product" value="product_type_1">
            <field name="attributeA" value="Foo" />
            <field name="attributeB" value="Bar" />
        </field>
        <field name="attributeC" value="Jeam" />
        <field name="attributeD" value="Beam" />
        <field name="attributeE" value="Deam" />
    </data>
</order>

<order>
    <data>
        <field name="time" value="10:10:11" />
    </data>
    <data>
        <field name="product" value="product_type_2">
            <field name="attributeF" value="Bravo" />
            <field name="attributeG" value="Echo" />
        </field>
        <field name="attributeC" value="Jeam2" />
        <field name="attributeD" value="Beam2" />
        <field name="attributeJ" value="Charlie" />
        <field name="attributeK" value="Tango" />
        <field name="attributeL" value="Zulu" />
    </data>
</order>

它是一组“order”元素,但“field”(数量和类型)取决于名称为“product”的元素的值。我有兴趣根据产品的值(value)提取信息。更具体地说,我最终会得到这样的表:

Time      Product          AttributeA AttributeB AttributeC AttributeD
10:10:10  product_type_1   Foo        Bar        Jeam       Beam
10:10:11  product_type_2                         Jeam2      Beam2

换句话说,我试图根据“order”子元素的值“剪切”不必要的信息。我试图通过使用 xpath (在 java 中)来实现这一点,但我陷入困境。我不可能模拟上面描述的“if”条件。

我正在考虑使用 xpath 查询一次检索一个订单元素,然后查询产品类型,然后选择适当的 xpath 来检索相应的属性,但这听起来确实效率低下且缓慢。

是否可以更有效地做到这一点? xpath 不是正确的答案吗?

提前致谢。

P.S:只要我检索到正确的数据,您在上面看到的数据的对齐和组织并不重要,那么我确信我能够以某种方式打印它们。

最佳答案

如果您想使用 XPath,您至少需要 XPath 3.0 或 XQuery(此代码在两者中均有效)。如果您想在 Java 中使用 XQuery 引擎,请查看 XQuery 引擎,例如 Saxon、BaseX、eXist DB,...

for $order in /database/order
return string-join((
  $order//field[@name='time']/@value,
  $order//field[@name='product']/@value,
  ($order//field[@name='attributeA']/@value, '')[1],
  ($order//field[@name='attributeB']/@value, '')[1],
  ($order//field[@name='attributeC']/@value, '')[1],
  ($order//field[@name='attributeD']/@value, '')[1]),
  '&#9;')

用于属性的模式可确保空值不会破坏表布局(因此对于第二种产品类型,属性 C 和 D 不会获取属性 A 和 B)。 是制表符。

<小时/>

如果您想使用 Java 进一步处理输出,我会这样做:获取所有订单 (/database/order) 并循环它们。然后,对于每个订单,使用 DOM(或再次使用 XPath)来获取所需的节点。然而,您提出的问题似乎不是您的实际问题,可能是使用 XQuery 可以带来更干净的解决方案。

关于java - 使用 xpath 根据另一个属性的值检索属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20181528/

相关文章:

python - 使用 xml.etree.ElementTree 在 Python 中进行简单的 dom 遍历

XSLT 转换传递参数

xml - XSLT:当测试具有特定名称的子节点的条件时

XSLT 根据元素值删除重复节点

java - Jenkins:\Java\jdk1.8.0_172\jre\bin""这时候没想到

java - 使用递归打印字符串 n 次

java - GridBagLayout 中最轻量级的间隔组件

.net - XML 炸弹(实体注入(inject))默认情况下在 .Net 4.0 中得到处理,但在 .Net 3.5 中没有。如何?什么改变了?

xml - "Invalid character in entity name"升级到 {N} 6.3 后 && 在条件

java - 为什么 z 没有在最小堆中冒泡?