2009-04-20 3 views
182

xpath 쿼리를 사용하면 노드 (태그)가 존재하는지 어떻게 알 수 있습니까? 내가 만드는 데 필요한 경우, 예를 들어 xpath 노드가 있는지 찾기

웹 사이트 페이지/HTML/몸/HTML/헤드/제목 예를 들어 너무

+0

필수 요소가 표시된 XML 스키마를 사용하는 것이 더 좋을까요? 문서가 사용하는지 확인하십시오. – abatishchev

답변

289
<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> 
+39

질문에 XSLT를 전혀 사용하지 않는다는 점을 감안하면 놀랄 정도입니다. – tjmoore

+0

이것은 굉장하지만 그것이 존재하는지 또는 비어 있는지 확인하고 싶다면 어떻게해야할까요? – SearchForKnowledge

+3

@SearchForKnowledge, 당신은 아마 그것을 SO에서 새로운 질문으로 물어봐야 할 것이지만, 빠른 가이드로서 : html/body and not (html/body/node())가 아니다. 모든 하위 노드 또는 텍스트 노드 포함). – Abel

2

다음 식을 시도

int numberofbodies = Integer.parseInt((String) xPath.evaluate("count(/html/body)", doc)); 
if(numberofbodies==0) { 
    // body node missing 
} 
+0

This Supered Greatly! –

64

: 변동 계수()를 사용하여 자바에서 XPath를 사용하는 경우 boolean(path-to-node)

+3

이것은 정확하게 Python에서 lxml로 XPath를 사용할 때 필요한 것입니다. –

+1

InfoPath 2010에서 규칙 조건 및 규칙 작업을 구성 할 때이 작업이 효과적이었습니다. – Merenzo

+3

이것은 대부분의 다른 대답과 달리 실제로는 XPath 쿼리라는 정답입니다. –

11

선택 사항을 사용하는 것이 더 좋을 수도 있고, 표현을 두 번 이상 입력하거나 (아마도 잘못 입력 할 필요가 없으며) 추가로 다른 동작을 수행 할 수 있습니다.

노드의 특정 번호가 세트보다 더 재미 있기 때문에 나는 매우 자주 count(/html/body) = 0을 사용합니다. 예를 들어 ... 귀하의 표현과 일치하는 노드가 두 개 이상 예기치 않게 발생했습니다.

<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> 
+0

위의 코드에서와 같이 xsl : when 절을 추가하여 동작을 변경하고 여러 조건을 여러 가지 방식으로 처리 할 수 ​​있습니다. – davenpcj

+0

'count (/ html/body) = 0' 천재! : D '/ body' (또는 무엇이든)가 빠졌을 때'someNode'를 선택하기 위해'/ html [count (/ body) = 0]/someNode'로 사용합니다. –

+1

@clickstefan,'/ html [count (/ body) = 0]'은 결코 아무것도 선택하지 않을 것이고, XML에는 두 개의 루트 노드가있을 수 없다. 어쩌면'/ html [count (body) = 0]','/ html [not (body)]'또는'/ html [not (exists (body)] '와 같을 것입니다. – Abel

38

패트릭은 xsl:if의 사용, 및 노드의 존재 여부를 확인하기위한 구문 모두 정확하다. 그러나 Patrick의 응답이 암시 하듯이 if-then-else와 같은 xsl은 없으므로 if-then-else와 비슷한 것을 찾고 있다면 일반적으로 xsl:choosexsl:otherwise을 사용하는 것이 좋습니다. 그래서, 패트릭의 예 구문은 작동하지만이 대안입니다 : 내가 루비에서 작업

<xsl:choose> 
<xsl:when test="/html/body">body node exists</xsl:when> 
<xsl:otherwise>body node missing</xsl:otherwise> 
</xsl:choose> 
+0

+1에 대해 'if-then-else', if-else if-else'? Davenpcj의 대답은'if = else if-else'가 될 때'test = "somexpath"'를 2 번째에 넣을 수 있습니까? – abi1964

+3

@Abhishek 예, 다른 조건의 xsl : when을 더 넣을 수 있으며 다중 분기 문을 사용할 수 있습니다. if-then-else보다 SELECT와 같을 것입니다. xsl : 그렇지 않으면 기본값 :. – davenpcj

+0

이것은 굉장하지만 그것이 존재하는지 또는 비어 있는지 확인하고 싶다면 어떻게해야할까요? – SearchForKnowledge

3

내가 요소를 가져오고 결과가 전무 있는지 살펴 노코 기리를 사용하여.

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? 
관련 문제