XPath:以不同方式定义的节点

XPath: nodes defined in different ways

我有一个 XML 文档,它是通过将对象树持久化到 XML 中生成的。在这棵树中,某种类型的节点(对象)可以以不同的方式出现:

  1. 它们是从另一个对象引用的,在 XML 术语中,这意味着它们是表示对象的节点的子节点。第一次发生这种情况时,节点具有 id 属性并通过子节点在原位序列化:
<productionLocation class="ch.sahits.game.openpatrician.model.city.impl.City" id="935">
    <wares id="936">
        <entry>
        <ch.sahits.game.openpatrician.model.product.EWare ware="BEER"/>
        <ch.sahits.game.openpatrician.model.product.AmountablePrice id="937">
            <amount class="javafx.beans.property.SimpleIntegerProperty" id="938">127</amount>
            <sum class="javafx.beans.property.SimpleDoubleProperty" id="939">2760.0</sum>
        </ch.sahits.game.openpatrician.model.product.AmountablePrice>
        </entry>
    </wares>
    <name>London</name>
    ...
</productionLocation> 
  1. 如果同一对象被另一个节点引用,而不是 id 属性,则有 reference 属性并且没有子节点代表该对象:
<birthPlace class="ch.sahits.game.openpatrician.model.city.impl.City" reference="935"/>
  1. 类似于第一种情况,可以从集合类型对象(映射、列表等)中引用节点,在这种情况下,不会有 class 属性,但该值将是节点名称。将有一个 idreference 属性:
<productionAndConsumption id="240">
    <entry>
    <ch.sahits.game.openpatrician.model.city.impl.City id="241">
        <wares id="242">
            <entry>
                <ch.sahits.game.openpatrician.model.product.EWare ware="BEER"/>
                <ch.sahits.game.openpatrician.model.product.AmountablePrice id="243">
                <amount class="javafx.beans.property.SimpleIntegerProperty" id="244">43</amount>
                <sum class="javafx.beans.property.SimpleDoubleProperty" id="245">0.0</sum>
                </ch.sahits.game.openpatrician.model.product.AmountablePrice>
            </entry>
        </wares>
        <name>London</name>
        ...
    </ch.sahits.game.openpatrician.model.city.impl.City>
    </entry>
</productionAndConsumption>

我想要实现的是获取一个节点列表,该列表代表定义类型 ch.sahits.game.openpatrician.model.city.impl.City.

对象的所有节点

到目前为止,我得到的是前两种情况的 XPath 表达式: //*[@class='ch.sahits.game.openpatrician.model.city.impl.City' and @id]

我遇到的问题是第二部分选择具有 id 属性的所有节点 ch.sahits.game.openpatrician.model.city.impl.City 并将其与上面的结合。

澄清:

给定一个 className 我需要找到所有具有所述 className 的 class 属性和 id 属性的所有节点或所有节点 className具有 id 属性。

XPath 表达式由两个单独的表达式组合而成 OR

第一部分来自问题本身,匹配案例 1),排除案例 2):

//*[@class='ch.sahits.game.openpatrician.model.city.impl.City' and @id]

第二部分选择具有 id 属性 ch.sahits.game.openpatrician.model.city.impl.City 的节点:

//ch.sahits.game.openpatrician.model.city.impl.City[@id]

将两者结合起来:

//*[@class='ch.sahits.game.openpatrician.model.city.impl.City' and @id] 
| //ch.sahits.game.openpatrician.model.city.impl.City[@id]