XPath: узлы, определенные по-разному - PullRequest
1 голос
/ 25 февраля 2020

У меня есть документ 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> 
Если на тот же объект ссылается другой узел, вместо атрибута 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.

1 Ответ

0 голосов
/ 26 февраля 2020

Выражение XPath состоит из двух отдельных выражений, которые объединяются с OR.

Первая часть относится к самому вопросу и соответствует случаю 1) и исключает случаи 2):

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

Вторая часть выбирает и узел с ch.sahits.game.openpatrician.model.city.impl.City, который имеет атрибут id:

//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] 
...