2010-06-18 3 views
7

저는 Apache 웹 서비스 xml rpc 라이브러리를 사용하여 rpc 서비스에 요청합니다. 이 과정에서 XML을 파싱 할 때 라이브러리가 다운로드하려고 시도하는 http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd에 대한 DTD 참조가있는 xml 문서가 있습니다. w3c가 Java 클라이언트에서이 정적 문서의 반복 다운로드를 차단하기 때문에이 다운로드는 503 상태 코드로 실패합니다.내부적으로 JAXP를 사용하는 Java 라이브러리에서 XML 카탈로그 사용

솔루션은 DTD를 로컬 캐시하기위한 XML 카탈로그입니다. 그러나 JAXP SAXParser 인스턴스에서 직접 EntityHandler를 설정하여 카탈로그 파서 지원을 활성화하는 예제를 찾을 수는 있지만 여기서 실제로는 기본 파서에 액세스 할 수 없습니다. 그것은 단지 xml rpc 라이브러리에 의해 사용되고 있습니다. 전역 속성이나 JAXP에 XML 카탈로그를 사용하도록 지시하는 어떤 방법을 설정할 수 있습니까?

답변

1

시스템 속성이 xml.catalog.files 인 것으로 생각합니다.

파서 공장에는 영향을주지 않습니다 xml.catalog.files을 설정,이 jaxp catalog 불행하게도

+0

을하고 난 이미 내 프로젝트에 XML-해결을 통합하려고 시도했습니다. 문제는 xml.catalog.files 시스템 등록 정보가 JAXP 판독기 인스턴스의 엔티티 확인자로 XML 리졸버를 설치 한 후에 만 ​​영향을줍니다. 내 문제는 웹 서비스 라이브러리에 의해 내부적으로 사용되는 JAXP 리더 인스턴스에 대한 액세스 권한이 없다는 것입니다. –

+0

프로그램을 시작할 때 명령 줄에서 해당 속성을 설정하면 파서 팩토리에서 "보았"지 않습니다? –

1

에 대한 Google 검색의 세 번째 히트이었다, BTW http://xml.apache.org/commons/components/resolver/resolver-article.html

를 살펴 보자. 이상적으로 그것은 물론, 리졸버를 사용하는 유일한 방법은 SAX 파서가 사용하는 핸들러에서 카탈로그 분석기에 해상도를 위임하는 메소드를 어떻게 든 추가하는 것입니다. 이미 SAX 파서를 사용하는 경우

, 그건 꽤 쉽게 :

final CatalogResolver catalogResolver = new CatalogResolver(); 
    DefaultHandler handler = new DefaultHandler() { 
     public InputSource resolveEntity (String publicId, String systemId) { 
      return catalogResolver.resolveEntity(publicId, systemId); 
     } 
     public void startElement(String namespaceURI, String lname, String qname, 
      Attributes attrs) { 
      // the stuff you'd normally do 
     } 
     ... 
    }; 

    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    SAXParser saxParser = factory.newSAXParser(); 
    String url = args.length == 0 ? "http://horstmann.com/index.html" : args[0]; 
    saxParser.parse(new URL(url).openStream(), handler); 

을 그렇지 않으면, 당신이 당신의 자신의 엔티티 리 조르바를 제공 할 수 있는지 여부를 파악해야합니다. javax.xml.parsers.DocumentBuilder를 사용하면됩니다. scala.xml.XML 객체로, 당신은하지만 당신은 속임수 사용할 수 없습니다 : 나는 그 기사를 보았던

val res = new com.sun.org.apache.xml.internal.resolver.tools.CatalogResolver 

val loader = new factory.XMLLoader[Elem] { 
    override def adapter = new parsing.NoBindingFactoryAdapter() { 
    override def resolveEntity(publicId: String, systemId: String) = { 
     res.resolveEntity(publicId, systemId) 
    } 
    } 
} 

val doc = loader.load(new URL("http://horstmann.com/index.html"))enter code here 
관련 문제