2011-08-20 4 views
3

Java에서 XPath를 사용하여 일부 HTML을 구문 분석하려고합니다. 다음과 같은 HTML을 고려하십시오.XPath로 태그 지정 및 태그 지정되지 않은 데이터 모두 사용하기

<td class="postbody"> 
     <img src="...""><br /> 
<br /> 
<b>What is Blah?</b><br /> 
<br /> 
Blah blah blah 
<br /> 

"멍청이란 무엇인가"는 유용하게 b 태그 안에 들어 있으므로 쉽게 파싱 할 수 있습니다. 하지만 "blah blah blah"는 공개되어 있으므로 상위 노드에서 text()를 호출하면됩니다.

나는이 작업을 순서대로 수행하고 img를 내린 다음 굵은 텍스트를 누른 다음 본문 텍스트를 입력해야합니다. 순서대로 끝나는 것이 중요합니다 (두 번 통과하는 방법을 제안 할 수 있다면 순서대로 처리 할 필요가 없습니다).

위의 내용을 Java XPath 노드에 포함시켜야한다면, 어떻게해야할까요?

+0

좋은 질문, +1. 간단하고 순수한 XPath 솔루션에 대한 내 대답을보십시오. –

답변

1

SAX 기반 파서가이 문제에 더 나은 도구라고 생각합니다. 이벤트 기반이므로 XML 문서를 순서대로 파싱 할 수 있습니다.

하지만 XML 파서이므로 올바른 XML 문서가 있어야합니다. 나는 JTidy을 한번도 사용하지 않았지만, HTML Tidy의 자바 포트이므로 유효하지 않은 HTML 문서를 유효한 XML로 변환하는 데 도움이되기를 바랍니다.

+0

아! JTidy를 이미 사용하고 있습니다. 저건 완벽 해. 나는 SAX 파싱을 시도하고 다시보고 할 것이다. 당신이 권하고 싶은 사람? – mtrc

+0

javax.xml.parsers.SAXParser를 사용해 보셨습니까? –

+1

SAX는 작업을 완료했으며 일반적으로 XPath를 사용하는 것보다 훨씬 깔끔했습니다. 이제 저는 다시 한번 행복하게 코딩하는 침팬지입니다. 감사! – mtrc

1

사용 컨텍스트 노드로 제공하는 XML 조각의 부모와 평가이 XPath 식는 :

node() 

이것은 모든 노드를 선택 - 모든 요소 -child, 모든 텍스트 - 컨텍스트 노드의 아이 -node-child, 모든 주석 - 하위 및 모든 PI (처리 명령어) - 하위. 당신의 의견과 연구 책임자를 제외 할 경우

, 사용

이 외에도 당신이 공백 전용 텍스트 노드를 선택하지 않는 경우
node()[not(self::comment() or self::processing-instruction)] 

, 사용 :

node() 
    [not(self::comment() or self::processing-instruction)] 
    [not(self::text()[string-length() = 0])] 
+0

이것을 위해 고맙다! 여기에 존재하지 않는 일부 기능이 있습니다. 결국 나는 SAX를 선택했다. 그러나 이것은 앞으로는 유용 할 것이다! – mtrc

+0

@ mtc06 : 예, XPath는 매우 강력합니다. 나는 당신이 내 대답을 유용하게 찾았 기 때문에 다행이다. 그리고 당신은 그것을 upvoting함으로써 이것을 확인할 수 있었다. :) –