2009-05-11 3 views
1

나는 saxon을 처음 사용하는 사람을 지적하고, 패키지의 문서와 예제를 따라 해 보았습니다.하지만이 문제에 대해서는 운이 좋지 않습니다. 문제.Saxon 8 (Java 버전) 문제

기본적으로 saxon v8을 사용하여 Java에서 일부 xml 처리를 시도하고 있습니다. 작업을 수행하기 위해 패키지에 포함 된 샘플 파일 중 하나를 가져 와서 필요에 맞게 수정했습니다. 그것은 네임 스페이스를 사용하지 않는 한 오래 작동합니다. 그리고 그것은 제 질문입니다. 네임 스페이스 문제를 해결하려면 어떻게해야합니까? 나는 그것을 사용하는 것을 정말로 신경 쓰지 않지만 내 XML에 존재하므로, 그것을 사용하거나 무시해야한다. 두 가지 해결책 모두 좋습니다.

어쨌든 여기에 내 시동 코드가 있습니다. 아무것도하지 않고 xpath 쿼리를 사용하여 하드 코딩 된 xml 문서에 대해 사용하려고 시도합니다. 내가 네임 스페이스를 포함하는 쿼리로 이것을 실행하는 경우의 예 XML 파일이 여기

public static void main(String[] args) { 
    String query = args[0]; 

    File XMLStream=null; 
    String xmlFileName="doc.xml"; 
    OutputStream destStream=System.out; 
    XQueryExpression exp=null; 
    Configuration C=new Configuration(); 
    C.setSchemaValidation(false); 
    C.setValidation(false); 

    StaticQueryContext SQC=new StaticQueryContext(C); 
    DynamicQueryContext DQC=new DynamicQueryContext(C);  
    QueryProcessor processor = new QueryProcessor(SQC); 
    Properties props=new Properties(); 
    try{ 
     exp=processor.compileQuery(query); 
     XMLStream=new File(xmlFileName); 
     InputSource XMLSource=new InputSource(XMLStream.toURI().toString()); 
     SAXSource SAXs=new SAXSource(XMLSource); 
     DocumentInfo DI=SQC.buildDocument(SAXs); 
     DQC.setContextNode(DI); 

     SequenceIterator iter = exp.iterator(DQC); 
     while(true){ 
      Item i = iter.next(); 
      if(i != null){ 
       System.out.println(i.getStringValue()); 
      } 
      else break; 
     } 
    } 
    catch (Exception e){ 
     System.err.println(e.getMessage()); 
    } 
} 

...

<?xml version="1.0"?> 
<ns1:animal xmlns:ns1="http://my.catservice.org/"> 
    <cat> 
     <catId>8889</catId> 
     <fedStatus>true</fedStatus> 
    </cat> 
</ns1:animal> 

, 오류가 발생합니다. 예 : /ns1:animal/cat/은 "접두사 ns1이 선언되지 않았습니다"라는 오류를 제공합니다.

쿼리에서 ns1 :을 제거하면 아무 것도 표시되지 않습니다. 나는 의사에게 "ns1 :"을 "동물"앞에 붙여서 제거하면 나는 쿼리 /animal/cat/을 성공으로 실행할 수 있습니다.

도움을 주시면 감사하겠습니다. 감사.

답변

2

오류 메시지는 xpath 표현식이 "ns1"접두사 접두사 (바인딩)를 의미하지 않음을 올바르게 지적합니다. 작동하는 문서가 "ns1"에 대한 바인딩을 사용한다고해서 반드시 사용해야하는 것은 아닙니다. 이는 XML에서 중요한 네임 스페이스 URI이고 접두어는 실제 내용에 대한 편리한 바로 가기이기 때문입니다.

그래서 어떻게 바인딩을 정의합니까? 2 가지 일반적인 방법이 있습니다. 접두어를 해석 할 수있는 컨텍스트를 제공하거나 XPath 표현식 내에 실제 URI를 포함시킵니다. 색슨 저자의 첫 번째 방법, this email에 관한

는 JAXP 방법 XPath.setNamespaceContext()를 언급, 마찬가지로 Jaxen XPath processor FAQ는 NamespaceContext을 구현해야로서 매우 편리 아니다 을 도울 수있는 몇 가지 예제 코드를 가지고 있지만, 당신은이 번 구현이 설정됩니다.

그래서 표기 방식은 보자 ... :

의 xmlns :

같은 네임 스페이스 선언 요소에 맞게 : 책 = "http://my.example.org/ Top Ten Tips to Using XPath and XPointer이 예를 보여줍니다 네임 스페이스/책 "

당신이 XPath는 이름처럼 사용

{http://my.example.org/namespaces/book} 섹션

하는 희망 Saxon (또는 Jaxen)이 이해합니다.

마지막으로 위의 해결 방법 중 하나를 사용하는 데 문제가 있으면 가능한 경우 Saxon9로 업그레이드하는 것이 좋습니다.

0

무언가를 상자에서 꺼내고 싶다면 embedding-xquery-in-java을 확인하십시오.Saxon을 사용하여 샘플 XQuery 표현식을 평가하는 github 프로젝트가 있습니다.

감사합니다.