Використовуючи xpath запит, як з’ясувати, чи існує вузол (тег) взагалі?
Наприклад, якщо мені потрібно було переконатися, що сторінка веб-сайту має правильну основну структуру, як / html / body та / html / head / title
Використовуючи xpath запит, як з’ясувати, чи існує вузол (тег) взагалі?
Наприклад, якщо мені потрібно було переконатися, що сторінка веб-сайту має правильну основну структуру, як / html / body та / html / head / title
Відповіді:
<xsl:if test="xpath-expression">...</xsl:if>
так, наприклад
<xsl:if test="/html/body">body node exists</xsl:if>
<xsl:if test="not(/html/body)">body node missing</xsl:if>
html/body and not(html/body/node())
(тобто просто перевірити, чи існує він, і він не містить дочірніх вузлів або текстових вузлів).
Спробуйте наступний вираз: boolean(path-to-node)
Патрік правильний, як у використанні xsl:if
, так і в синтаксисі для перевірки наявності вузла. Однак, як випливає з відповіді Патріка, немає xsl, еквівалентного if-then-else, тому якщо ви шукаєте щось більше, як якщо-то-інше, вам зазвичай краще використовувати xsl:choose
та xsl:otherwise
. Так, синтаксис прикладу Патріка спрацює, але це альтернатива:
<xsl:choose>
<xsl:when test="/html/body">body node exists</xsl:when>
<xsl:otherwise>body node missing</xsl:otherwise>
</xsl:choose>
if-then-else
, а як же if-else if-else
? У відповіді davenpcj чи можу я помістити його test="somexpath"
у 2-е місце, коли це зробити if-else if-else
?
Можливо, краще використовувати вибір, не потрібно вводити (або, можливо, неправильно вводити) свої вирази не один раз, і дозволяє вам слідувати додатковим різним поведінкам.
Я дуже часто використовую count(/html/body) = 0
, оскільки конкретна кількість вузлів цікавіше набору. Наприклад ... коли неочікувано більше 1 вузла, який відповідає вашому вираженню.
<xsl:choose>
<xsl:when test="/html/body">
<!-- Found the node(s) -->
</xsl:when>
<!-- more xsl:when here, if needed -->
<xsl:otherwise>
<!-- No node exists -->
</xsl:otherwise>
</xsl:choose>
count(/html/body) = 0
геній! : DI використовуйте його як /html[count(/body)=0]/someNode
для вибору, someNode
коли /body
(або що завгодно) відсутнє
/html[count(/body)=0]
ніколи нічого не вибере, у XML не може бути двох кореневих вузлів. Можливо, ви мали на увазі /html[count(body)=0]
, що було б те саме /html[not(body)]
, що або /html[not(exists(body))]
.
Я працюю в Ruby і за допомогою Nokogiri я отримую елемент і дивлюсь, чи є результат нульовим.
require 'nokogiri'
url = "http://somthing.com/resource"
resp = Nokogiri::XML(open(url))
first_name = resp.xpath("/movies/actors/actor[1]/first-name")
puts "first-name not found" if first_name.nil?
Варіант при використанні xpath в Java за допомогою count ():
int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc));
if( numberofbodies==0) {
// body node missing
}