У меня есть документ 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"/>
Аналогично первому случаю на узел можно ссылаться из объекта типа коллекции (map, list, ...), в этом случае атрибута
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]
С чем я сталкиваюсь, так это со второй частью, которая выбирает все узлы ch.sahits.game.openpatrician.model.city.impl.City
, которые иметь атрибут id
и объединить его с приведенным выше.
Уточнение:
Учитывая className
Мне нужно найти все узлы, которые имеют атрибут класса className
и атрибут id
или все узлы className
с атрибутом id
.