набор узлов в xpath

Ты очень близко. Прежде всего, позвольте мне сказать, что есть много способов решить эту проблему. Вот один из них:

вы можете передать объект player в monsterFight(Player player)

public class Player {

   private int health;
   private int lvl;

   public Player(int health, int lvl) {
       this.health = health;
       this.lvl = lvl;    
   }

  ...
  // getters & setters

}

, а затем в monsterFight(Player player) вы можете вызвать player.setHealth(health) всякий раз, когда игрок теряет здоровье. !

6
задан Wayne Burkett 6 July 2011 в 22:54
поделиться

1 ответ

Это - часто фиксировавшая ошибка. Никогда не используйте XPath"! =" оператор, когда один или оба из операндов набор (наборы) узлов.

   value != node-set

по определению верно, если там существует узел n в наборе узлов, таком что

   value не равно string(n)

То, что Вы хотите, является этим

   value не равно никакому узлу в наборе узлов.

Это может быть выражено следующим образом:

   value = node-set

верно, если там существует по крайней мере один узел n в наборе узлов, таком что:

   value = string(n)

Затем

   not(value = node-set)

верно, если там не существует никакой узел n в наборе узлов, таком что

   value = string(n)

Поэтому следующее выражение XPath выберет желаемые узлы:

 /*/*/describes[not(. = ../../*/physical/distribution/@id)
              and 
                not(. = ../../*/implementation/distribution/@id)]

Я лично предпочел бы иметь всего одно сравнение узла контекста к объединению этих двух наборов узлов:

 /*/*/describes
            [not(. = (../../*/physical/distribution/@id
                    | 
                      ../../*/implementation/distribution/@id
                     )
                 )
            ]

Действительно обратите внимание, что я избегаю использования "//" сокращение. Это обычно очень дорого (неэффективный) и должно использоваться, только если мы не знаем структуру XML-документа.

И, конечно, вышеупомянутые выражения XPath должны быть eavaluated против следующего XML-документа (второй, обеспеченный в вопросе):

<eml>
    <datatable>
        <physical>
            <distribution id="100"/>
        </physical>
    </datatable>
    <datatable>
        <physical>
            <distribution id="300"/>
        </physical>
    </datatable>
    <software>
        <implementation>
            <distribution id="200"/>
        </implementation>
    </software>
    <additionalMetadata>
        <describes>100</describes>
        <describes>200</describes>
        <describes>300</describes>
        <describes>400</describes>
    </additionalMetadata>
</eml>
19
ответ дан 8 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: