Подтвердить что ты не робот

Как проверить, существует ли элемент в xml с помощью xpath?

Ниже приведена иерархия элементов. Как проверить (используя xpath), что элемент AttachedXml присутствует в CreditReport Первичного Потребителя

<Consumers xmlns="http://xml.mycompany.com/XMLSchema">
       <Consumer subjectIdentifier="Primary">
          <DataSources>
               <Credit>
                   <CreditReport>
                      <AttachedXml><![CDATA[ blah blah]]>
4b9b3361

Ответ 1

Используйте boolean() функцию XPath

Булева функция преобразует ее аргумент логическому следующему:

  • число истинно тогда и только тогда, когда он не является ни положительным, ни отрицательным ноль или NaN

  • a node -set истинно тогда и только тогда, когда он не пуст

  • строка истинна тогда и только тогда, когда его длина отлична от нуля

  • объект другого типа, кроме четыре основных типа преобразуются в boolean таким образом, который зависит от этот тип

Если в CreditReport имеется AttachedXml , то он вернет true().

boolean(/mc:Consumers
          /mc:Consumer[@subjectIdentifier='Primary']
            //mc:CreditReport/mc:AttachedXml)

Ответ 2

Использование

boolean(/*/*[@subjectIdentifier="Primary"]/*/*/*/*
                           [name()='AttachedXml' 
                          and 
                            namespace-uri()='http://xml.mycompany.com/XMLSchema'
                           ]
       )

Ответ 3

Обычно, когда вы пытаетесь выбрать node, используя xpath, ваш xpath-engine вернет null или эквивалент, если node не существует.

xpath: "/Consumers/Consumer/DataSources/Credit/CreditReport/AttachedXml"

Если вы используете xsl, проверьте этот вопрос для ответа:

xpath find, если node существует

Ответ 4

Саксонская документация, хотя и немного неясна, кажется, предполагает, что API JAXP XPath вернет false при оценке выражения XPath, если не найдено совпадающих узлов.

В этой статье IBM @упоминается возвращаемое значение null, когда ни один из узлов не сопоставляется.

Возможно, вам придется немного поиграть с типами возвращаемых данных на основе этого API, но основная идея заключается в том, что вы просто запускаете обычный XPath и проверяете, является ли результат node/false/null/etc.

XPathFactory xpathFactory = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);
XPath xpath = xpathFactory.newXPath();
XPathExpression expr = xpath.compile("/Consumers/Consumer/DataSources/Credit/CreditReport/AttachedXml");
Object result = expr.evaluate(doc, XPathConstants.NODE);

if ( result == null ) {
    // do something
}

Ответ 5

взгляните на мой пример

<tocheading language="EN"> 
     <subj-group> 
         <subject>Editors Choice</subject> 
         <subject>creative common</subject> 
     </subj-group> 
</tocheading> 

теперь, как проверить, существует ли creative common

tocheading/subj-group/subject/text() = 'creative common'

надеюсь, что это поможет вам

Ответ 6

Если boolean() недоступен (инструмент, который я использую, нет), один из способов его достижения:

//SELECT[@id='xpto']/OPTION[not(not(@selected))]

В этом случае в пределах параметра /OPTION один из вариантов является выбранным. "Выбранный" не имеет значения... он просто существует, а другой OPTION не имеет "выбрано". Это достигает цели.