2010-03-26 6 views
7

정의와 구현이 제 통제를 벗어나는 타사 웹 서비스를 사용하고 있습니다. 이 웹 서비스는 앞으로 변경 될 것입니다.WSDL에서 인라인 XSD를 XSD 파일로 자동 추출

웹 서비스는 웹 서비스와 동일한 데이터 (동일한 XSD 유형으로 나타남) 중 일부와 프로그램에서 생성 된 일부 추가 정보가 포함 된 XML 파일을 생성하는 데 사용해야합니다.

내 방식 :

  1. 내 자신의 XSD가 호출 된 웹 서비스의 WSDL의 XSD 정의를 참조 만들
  2. 자바를 사용 (이 XSD는 분명히 추가 정보에 대한 XSD 유형이 포함됩니다.) 1 단계에서 만든 내 XSD 파일에서 데이터 바인딩 클래스를 생성하는 XML 데이터 바인딩 프레임 워크 (예 : ADB 또는 JiXB)
  3. WSDL에서 데이터 바인딩 클래스를 생성하기 위해 동일한 데이터 바인딩 프레임 워크에서 Java SOAP 프레임 워크 (Axis2 또는 CXF) 이 기능을 사용하면 웹 서비스에서 검색 한 객체를 직접 사용할 수 있습니다 on의 XML을 참조하십시오.

내 XSD 파일에서 사용할 예정이지만 WSDL에 정의 된 XSD 유형은 변경 될 수 있습니다. 변경 될 때마다 XSD 및 WSDL 데이터 바인딩을 자동으로 처리하려고합니다. (. 변화가 충분히 큰 경우,이 몇 가지 개발 노력을 트리거 (그러나 일반적으로하지 않을 수 있습니다).)

내 문제 :

웹에서 사용하는 나는이 같은 유형을 참조 XSD에 필요한 1 단계에서

서비스.

WSDL은 다른 WSDL을 지칭하는 다른 WSDL을 참조합니다. 결국에는 필요한 인라인 XSD 유형이있는 WSDL이 있습니다. 내가 아는 한 XSD에서 인라인 XSD 유형의 WSDL을 직접 참조 할 수있는 방법이 없습니다.

가장 실용적이라고 생각하는 접근법은 인라인 XSD를 WSDL에서 다른 XSD 파일로 추출하는 자동 처리 (데이터 바인딩 전)에 추가 단계를 포함하는 것입니다. 이러한 다른 XSD 파일은 내 자신의 XSD 파일에서 참조 할 수 있습니다.

것들 내가 피할 싶습니다

  • 가 수동으로 XSD 파일에 인라인 XSD를 붙여 복사
  • 수동 단계를 (하여 결정처럼 (I은 자동 프로세스를 찾고 있어요.). 수동으로 인라인 유형을 포함하는 WSDL (해당 WSDL의 위치도 변경됩니다.)
  • 내 XSD에서 xsd : any를 사용합니다. 내 자신의 XSD 파일이 올바른지 싶습니다.

PS를 구현

  • 엄청난 양의 (.NET 등)이 아닌 자바 기술을 사용하여 (하지만 이러한 추출을 구현하는 것이 방법에 대한 힌트 어쨌든 환영) : 나는 몇 가지 비슷한 질문을 발견, 그러나 그들은 모두 다음과 같은 반응을 보였습니다 : WTH 당신이 그것을하고 싶습니까? 그게 내 큰 배경 이야기의 이유입니다.

  • 답변

    3

    이 작업을 수행하는 라이브러리를 모르지만 약간의 노력 (~ 200 줄)으로 구현하는 것이 가능합니다.모든 인라인 및 포함 된 XSD를 생성하는 대략적인 메타 프로그램 :

    method processWSDL(Document wsdl) { 
        for each ("/wsdl:definitions/wsdl:types/xsd:schema" in wsdl) { 
         call processXSD("inline_[i].xsd",".") 
        } 
        for each ("/wsdl:definitions/wsdl:import" in wsdl) { 
         Document x = read and parse ("@location") 
         if (x is WSDL) call processWSDL(x) 
         else if (x is XSD) call processXSD("@location", x) 
        } 
    } 
    
    method processXSD(String filename, Document xsd) { 
        write "xsd" to a new file "filename" // if 'filename' is a URL, take only the part after the last '/' 
        for each ("/xsd:schema/xsd:import" or "/xsd:schema/xsd:include" in xsd) { 
         if ("@schemaLocation" is local reference) {  // no 'http://' prefix 
          Document x = read and parse ("@schemaLocation") 
          call processXSD("@schemaLocation", x) 
         } 
        } 
    } 
    

    인라인 스키마 외부에서 정의 된 네임 스페이스 접두사는 처리하지 않지만 잘하면 시작점을 제공합니다.

    +0

    는 이미이 같은 필요가있을 것이라고 짐작했다. 난 실제로 뭔가 더 많은 프레임 워크 같은 : ** (XmlSchema xmlSchema : wsdl.extractNamespaceSchemas()) xmlSchema.writeFile (ns2FileName (xmlSchema.getTargetNamespace())); ** 아, 불완전한 세계 ... –

    +0

    @ Steven : 오픈 소스 프로젝트가 세상을 완벽하게 마무리 할 수있는 기회처럼 들린다. ;-) –

    2

    이 게시물을 관련성있게 유지하기 위해 답변이 수락 된 이후로 변경되었습니다. 이제는 Java에서 WSDL로 시작하려는 것을 생성 할 수 있습니다. JAX-WS는 정확히 요청한 것을 수행하는 wsimport 도구를 제공합니다. WSDL을 사용하여 요청을 언/마샬링하기 위해 여러 개의 JAXB 주석 클래스와 함께 클라이언트 프록시를 만듭니다.

    @MoizTankiwala의 요점은 WSDL에서 XSD 컨텐트를 내보내거나 WSDL의 유형 섹션 안에 모든 외부 XSD 컨텐트를 포함해야한다는 것입니다.

    전자는 누군가 XSD가 많을 때 의미가 있으며 XSD에서 해당 모델을 효과적으로 관리, 분석 및 발전시키는 것과 관련하여 일반적인 우려가 있습니다.

    WSDL에서 클라이언트 측 프록시 생성에 이르기까지 일부 (주로) 동적 언어가 툴링을 지원하지 못하기 때문에 후자 역시 필요합니다. 적어도 Moiz의 요청에 도움이 비슷한 필요성

    other answer on SO 회담 ...

    관련 문제