Как проверить, существует ли элемент в xml с помощью xpath? - PullRequest
43 голосов
/ 17 апреля 2011

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

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

Ответы [ 6 ]

79 голосов
/ 17 апреля 2011

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

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

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

  • набор узлов истинен тогда и только тогда, когда он не пуст *

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

  • объект типа, отличного от четырех основных типов, преобразуется в логическое значениезависит от этого типа

Если в CreditReport из основного * есть AttachedXml 1034 * Потребитель , затем вернется true().

boolean(/mc:Consumers
          /mc:Consumer[@subjectIdentifier='Primary']
            //mc:CreditReport/mc:AttachedXml)
6 голосов
/ 17 апреля 2011

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

boolean(/*/*[@subjectIdentifier="Primary"]/*/*/*/*
                           [name()='AttachedXml' 
                          and 
                            namespace-uri()='http://xml.mycompany.com/XMLSchema'
                           ]
       )
5 голосов
/ 17 апреля 2011

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

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

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

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
}
4 голосов
/ 17 апреля 2011

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

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

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

xpath найти, если узел существует

1 голос
/ 14 марта 2017

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

<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'

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

0 голосов
/ 11 июня 2013

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

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

В этом случае, в / OPTION, один из вариантов -выбранный.«Выбранный» не имеет значения ... он просто существует, в то время как другой ВАРИАНТ не имеет «выбранного».Это достигает цели.

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