Как проверить, существует ли элемент в xml с помощью xpath?
Ниже приведена иерархия элементов. Как проверить (используя xpath), что элемент AttachedXml присутствует в CreditReport Первичного Потребителя
<Consumers xmlns="http://xml.mycompany.com/XMLSchema">
<Consumer subjectIdentifier="Primary">
<DataSources>
<Credit>
<CreditReport>
<AttachedXml><![CDATA[ blah blah]]>
Ответы
Ответ 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 не имеет "выбрано". Это достигает цели.