2010-07-24 5 views
0

아래 코드에서 XPath를 사용하여 'handler'XML 요소에 액세스하려고 시도하고 있지만 'elemHandler'요소는 항상 null입니다. 누구나 나와 함께 분명한 해결책을 공유 할 수 있습니까? 미리 감사드립니다.JDom을 사용하는 XPath

import java.io.IOException; 
import java.io.StringReader; 

import org.jdom.Element; 
import org.jdom.JDOMException; 
import org.jdom.input.SAXBuilder; 
import org.jdom.xpath.XPath; 

public class XPathTest { 
    private static String jobString = "<job name=\"Workflow.JOB\">" + 
              " <handler name=\"xslt.converter\"/>" + 
              " <handler name=\"openoffice.renderer\">" + 
              " <opts input=\"ODS\" output=\"PDF\"/>" + 
              " </handler>" + 
              "</job>"; 

    public static void main(String[] args) { 
    try { 
     Element elemJobInfo = new SAXBuilder().build(new StringReader(jobString)).detachRootElement(); 
     XPath handlerExpression = XPath.newInstance("//stp:handler[2]"); 
     handlerExpression.addNamespace("stp", "http://service.mine.org/dgs"); 
     Element elemHandler = (Element) handlerExpression.selectSingleNode(elemJobInfo); 
     jobString = elemHandler.toString(); 
    } 
    catch (IOException e) { 
     System.out.println("Failure: " + e); 
    } 
    catch (JDOMException e) { 
     System.out.println("Failure: " + e); 
    } 
    catch (Exception e) { 
     System.out.println("Failure: " + e); 
    } 
} 
} 

답변

1

stp 네임 스페이스는 무엇입니까? jobString의 XML은 네임 스페이스를 참조하지 않습니다. 접두어없이 해봤습니까?

//handler[2] 
+0

예, 있습니다

또한, (또는 네임 스페이스 접두사없이) 당신의 XPath 식의 변화를 시도 할. 연구에 따르면 XPath는 규정되지 않은 이름 공간 및/또는 기본 네임 스페이스에서 작동하지 않습니다. 당신은 하나를 제공해야합니다. – user5257774

+1

XPath는 실제로 기본 네임 스페이스에서 작동합니다. 내가 인식하고있는 유일한 네임 스페이스 문제는'xmlns = "some-uri"선언을 존중하지 않는다는 것입니다. 문서에서 빈 접두사를 변경하면 XPath는이를 무시합니다. 기본 네임 스페이스에없는 요소에 대한 네임 스페이스 접두사가 필요합니다. 예를 들어'/ html'을 사용하여 XHTML 문서에서'와 일치시킬 수 없습니다. –

1

XPath 식하는에 대해 XML 문서 :

//stp:handler[2]

이 평가는, 디폴트 또는 선언 된 네임 스페이스가 없으며 모든 노드가 "네임 스페이스"에 있습니다. "http://service.mine.org/dgs" 네임 스페이스에 노드가 없습니다. 실제 상황에서 다른 XML 문서를 사용하지 않는다면, 위의 표현식은 노드를 선택해서는 안되며, 이것은 정확히 당신이 얻는 것입니다.

아직 표시하지 않은 문서를 사용하고있는 경우, 실제로 기본 네임 스페이스가있는 경우 Java 코드에서 네임 스페이스를 잘못 입력했을 가능성이 있습니다.

(//stp:handler)[2]

+0

감사합니다. Dimitre. 그 변형을 시도했지만 효과가 없었습니다. 이 시점에서 필자는 XML 문서의 이름을 완전히 지우는 등 많은 변형을 시도했습니다. 지금까지 게시 한 모든 포럼에서 여러분을 제외한 모든 사람들이 무언가를 얻는 것보다 비폭력적인 전투에 더 관심이 있습니다. 나는 누군가가 코드 스 니펫을 가져 와서 jdom.jar과 jaxen.jar를 붙잡고 이것이 정말로 어떻게 작동해야하는지 말해 주려고 오랫동안 간절히 바란다. – user5257774

+0

@topsquire : 불행히도 Java에서는 작동하지 않습니다. C# 또는 MSXML DOM이라면 도움이 될 것입니다. 이것은 다른 환경에서 비 namespaced 표현식이 노드를 선택할 것이기 때문에 XPath 질문이 아닙니다. 아마 당신은 필요에 따라 Java XPath API를 사용하지 않을 것입니다. 사용 가능한 문서를 참조하십시오. 일반적으로 따르는 예제가 들어 있습니다. 또한 Java 관련 포럼에서 질문 할 수 있습니다. 특정 XPath 표현식에 의해 선택된 노드는 XPath를 호스팅하는 언어 인 XSLT 환경에서 평가할 수 있습니다. –