XPath:以不同方式定义的节点
XPath: nodes defined in different ways
我有一个 XML 文档,它是通过将对象树持久化到 XML 中生成的。在这棵树中,某种类型的节点(对象)可以以不同的方式出现:
- 它们是从另一个对象引用的,在 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>
- 如果同一对象被另一个节点引用,而不是
id
属性,则有 reference
属性并且没有子节点代表该对象:
<birthPlace class="ch.sahits.game.openpatrician.model.city.impl.City" reference="935"/>
- 类似于第一种情况,可以从集合类型对象(映射、列表等)中引用节点,在这种情况下,不会有
class
属性,但该值将是节点名称。将有一个 id
或 reference
属性:
<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]
我有一个 XML 文档,它是通过将对象树持久化到 XML 中生成的。在这棵树中,某种类型的节点(对象)可以以不同的方式出现:
- 它们是从另一个对象引用的,在 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>
- 如果同一对象被另一个节点引用,而不是
id
属性,则有reference
属性并且没有子节点代表该对象:
<birthPlace class="ch.sahits.game.openpatrician.model.city.impl.City" reference="935"/>
- 类似于第一种情况,可以从集合类型对象(映射、列表等)中引用节点,在这种情况下,不会有
class
属性,但该值将是节点名称。将有一个id
或reference
属性:
<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]