Проверка XPath, если элемент отсутствует или не содержит требуемого значения - PullRequest
0 голосов
/ 09 октября 2019

Я хочу сообщить о проблемах, когда определенный элемент отсутствует или если он не содержит требуемого значения.

Мой инициал, когда он присутствует, но не содержит требуемого текста, работает нормально:

xmllint ./myfiles*/*.xml --xpath "//descendant-or-self::node()[local-name(.) = 'personName' and not(text() = 'novice')]"

Как включить случай, когда в теге отсутствует целое?

Вот моя попытка, которая не работает:

xmllint ./myfiles*/*.xml --xpath "not(//descendant-or-self::node()[local-name(.) = 'personName' and not(text() = 'personName')]) or (//descendant-or-self::node()[local-name(.) = 'personName' and not(text() = 'novice')])"

Высокий уровень XML

<com.mycompany.MyTestClass>
    <id>12312312</id>
    <uberclass>
        .. more xml here
    </uberclass>
    <personAge>11</personAge>
    .. more xml here
    <personName>novice</personName>
    ...more xml here
</com.mycompany.MyTestClass>

1 Ответ

0 голосов
/ 10 октября 2019

Выражение not(X='value') возвращает true, если набор узлов, выбранных X, не включает в себя узел, строковое значение которого равно value. Это включает в себя случай, когда набор узлов, выбранных X, пуст, то есть, где узел отсутствует.

Теперь вопрос в том, что вы хотите, чтобы ваше выражение возвращало? Если вы хотите, чтобы он возвращал соответствующий элемент, если он существует и имеет требуемое значение, или пустой набор узлов, в противном случае вы можете просто написать

//personName[. = 'novice']

Если вы хотите вернуть логическое значение, которое сообщает вамсуществует ли такой узел, вы можете написать

boolean(//personName[. = 'novice'])

На самом деле вы можете сократить его до

//personName = 'novice'

, хотя я лично считаю это менее ясным, и у него есть недостаток, заключающийся в том, что вы можетеНе применяйте то же сокращение к более сложным предикатам, таким как

//personName[starts-with(., 'novice')]

Если вы хотите получить обратное (верните true, если элемент не существует или не имеет правильного значения), тогда

not(//personName[. = 'novice'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...