2014-10-29 8 views
1

catalog.xml에 나열된 .xsd 파일로 일부 xml 파일의 유효성을 검사해야하지만 데이터베이스에 있습니다. 그래서 resolver가 필요합니다. catalogId에서 systemId와 blob로 저장된 .xsd 파일을 데이터베이스에 일치시킵니다. 이 작업을 수행하는 XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) 메서드를 찾았지만 파서가이 메서드를 사용하는 방법을 찾을 수 없으므로 제대로 처리하지 못하는 방법을 잘 모르겠습니다. 나는 Stream에서 .xsd 파일을 포함하고있는 XMLInputStram을 반환한다고 생각했지만 XMLInputSource 문서에 따르면 "엔터티의 해상도를 그대로두고 호출자에게 입력 스트림을 여는 것이기 때문에"사실이 아닙니다.catalog.xml 엔터티를 데이터베이스와 일치시키는 방법은 무엇입니까?

내 질문은 - 데이터베이스에 저장된 .xsd 파일을 사용하여 catalog.xml의 엔티티를 매핑하는 방법입니다.

나는 분명히 문제를 분명히 설명하기를 희망하지만, 내 영어가 정말 가난하다는 것을 알고 있습니다. 더 자세한 내용이나 더 나은 설명을 요청하십시오.

인사말, Rzysia

답변

0

좋아, 나는 해결책을 발견 - 내가 생각으로, 방법 XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier)이 speciefied XSD 스키마를 포함하는 내 자신의 InputStream 잘 살고와 반환 XMLInputSource를 샤 우드. 이 오버라이드 클래스의 내 버전 : 당신의 재생에 대한

public XMLInputSource resolveEntity(XMLResourceIdentifier resourceIdentifier) 
     throws XNIException, IOException { 

    String resolvedId = resolveIdentifier(resourceIdentifier); 

    if (resolvedId != null) { 
     XMLInputSource xmlis = new XMLInputSource(resourceIdentifier.getPublicId(), 
       resolvedId, 
       resourceIdentifier.getBaseSystemId()); 

     try { 
      InputStream is = getXSDFromDb(resourceIdentifier.getLiteralSystemId());     
      xmlis.setByteStream(is); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
     } 

     return xmlis; 
    } 
    return null; 
1

가 여기에 에 대한 the resolver I wrote입니다. 이 해석자는 시스템 ID를 Maven 아티팩트의 리소스로 해석합니다. 이것은 당신과 비슷한 작업입니다.

  • 귀하의 작업은 기본적으로 resolveEntity 메소드를 구현하는 것입니다.
  • 일반적으로 기존 CatalogResolver을 확장하는 것이 실용적입니다.
  • 그런 다음 getResolvedEntity 메서드를 재정의 할 수 있습니다.
  • 일반적으로 systemId/publicId을 해결하기 위해 super 메서드를 호출합니다.
  • 그런 다음 사용자 지정 해결을 시도합니다.
  • systemId은 일반적으로 자원 위치 URL (또는 논리 URI)입니다.
  • publicId은 종종 네임 스페이스 URI입니다.

여기에 클래스 경로에 classpath:com/acme/foo/schema.xsd를 해결 another resolver에서 간단한 코드입니다 :

  • database:schema:table:value:id:schema.xsd 같은 URI 스키마를 정의 : 시나리오에서

    public static final String URI_SCHEME_CLASSPATH = "classpath"; 
    
    @Override 
    public String getResolvedEntity(String publicId, String systemId) { 
        final String result = super.getResolvedEntity(publicId, systemId); 
    
        if (result == null) { 
         return null; 
        } 
    
        try { 
         final URI uri = new URI(result); 
         if (URI_SCHEME_CLASSPATH.equals(uri.getScheme())) { 
          final String schemeSpecificPart = uri.getSchemeSpecificPart(); 
          final URL resource = Thread.currentThread() 
            .getContextClassLoader() 
            .getResource(schemeSpecificPart); 
          if (resource == null) { 
           return null; 
          } else { 
           return resource.toString(); 
          } 
         } else { 
          return result; 
         } 
        } catch (URISyntaxException urisex) { 
         return result; 
        } 
    } 
    

    이, 나는 다음을 할 거라고 .

  • 이러한 URI를 확인할 수있는 카탈로그 분석기를 작성하십시오.
  • 네임 스페이스 URI 또는 ​​절대 스키마 위치 URL을 database:... URI로 다시 쓰는 카탈로그 파일을 정의하십시오.
    REWRITE_SYSTEM "http://example.com/schemas" "database:schemas:content:schema_id:example/schemas" 
    
    • 는 그래서 "기본"카탈로그 해결이 먼저 database:schemas:content:schema_id:example/schemas/schema.xsdhttp://example.com/schemas/schema.xsd를 해결하는 것입니다 : 같은 간단한 표기법에

    이 볼 수있는 작품.

  • 그러면 코드가 database:schemas:content:schema_id:example/schemas/schema.xsd을 데이터베이스 리소스로 해석합니다.
+0

덕분에, 그것은 나에게 정말 유익합니다. 내'XMLCatalogResolver' (org.apache.xerces.util')는'EntityResoler'와'XMLEntityResolver' 만 구현하고'CatalogResolver'는 확장하지 않습니다. 나는 이것을 추가하고'System.out.print'만으로'getResolvedEntity' 메소드를 오버라이드하고'super.getResolvedEntity' 메소드를 호출했지만, 내 프로그램은 사용하지 않았다 ... 나는 이것을 쓰는 것을 잊었다 - 나는 sbd를 수정해야한다. else code, 나는 처음부터 – rzysia

+0

에서이 프로그램을 작성하지 않는다. 내 프로그램은'XMLEntityResolver' 인터페이스에서'resolverEntity'를 호출하고있다. 그러나이 함수에 내 자신의 resolver를 쓰는 것과 같을 것이라고 생각한다. – rzysia

+0

@rzysia 죄송합니다. 내가 당신의 코드에서 그렇게 깊이 도울 수 있다고 생각하지 마십시오. 당신의 케이스와'* Resolver'-interfaces에서 호출되는 것을 연결선으로 찾으십시오. 또는 리졸버에서 아날로그 개념을 사용하십시오. 행운을 빕니다. – lexicore