Проверка XPath для несуществующих node

У меня возникли проблемы с поиском правильного синтаксиса XPath, чтобы проверить, существует ли какой-либо конкретный node в моем XML. Мне разрешено использовать XPath (так что нет XSL или что-то еще подобное, это должен быть чистый синтаксис выражения XPath).

У меня есть XML и он имеет node Filename, но он не существует в каждом случае. Когда имя файла не указано, мои процессы LiveCycle будут использовать другой маршрут для заполнения имени файла. Но как проверить, существует ли Filename node?

Ответы

Ответ 1

Вы можете использовать функцию count - прохождение по пути узлов, которые вы проверяете.

Если они не существуют, то значение count будет 0:

count(//Filename) = 0

Ответ 2

Подобно счету, но, возможно, более прямому в зависимости от того, что вы хотите, является функция boolean

boolean(//Filename)

Это возвращает true, если существует "Имя файла" node и false, если нет.

Ответ 3

Предположим, что у вас есть следующий XML-документ:

<top>
  <function>
    <filenamex>c:\a\y\z\myFile.xml</filenamex>
    <default>Default.xml</default>
  </function>
</top>

, то это выражение XPath выбирает либо элемент filename, когда он присутствует, либо элемент default, если не указан элемент filename:

(/*/function/filename
|
 /*/function/default
 )
  [1]

Самый короткий способ проверить, существует ли элемент filename::

/*/function/filename

Итак, первое выражение XPath можно было переписать в эквивалентном (но несколько дольше):

 /*/function/filename
|
 /*/function/default[not(/*/function/filename)]

Ответ 4

Учитывая пример Xml из другого ответа

<top>
  <function>
    <filenamex>c:\a\y\z\myFile.xml</filenamex>
    <default>Default.xml</default>
  </function>
</top>
  • Чтобы получить узлы WITH node "filenamex" use/top/function [filenamex]
  • Чтобы получить узлы БЕЗ node "filenamex" использовать /top/function [not (filenamex)]

Я счел нужным ответить здесь, поскольку другие ответы не работали так, как рекламировались в XmlSpy