2011-10-24 3 views
3

내 프로젝트의 일부로 사용자 정의 스키마 문서의 많은 변환이 필요합니다. 대상 네임 스페이스를 변경하고 형식 상호 참조를 지원하며 복수 스키마 문서를 만들 때 wsdl을 빌드 할 수 있어야합니다. 가장 일반적으로 사용되는 작업 중 하나는 스키마를 wsdl 파일로 가져 오기 전에 네임 스페이스 접두어를 변경하는 것입니다. 나는 org.xml.sax.ContentHandler을 사용하고있다. 이름 공간을 처리하는 방법은 startPrefixMapping이다. 요소 유형을 변경하지 않으면 모든 것이 잘 작동합니다. 여기 XML 스키마. 네임 스페이스 인식 속성 값 처리

다음과 같이 WSDL 내에 배치되어야 간단한 스키마 단편

<schema xmlns="http://www.w3.org/2001/XMLSchema"> 
    <complexType name="Param"> 
    <sequence> 
     <element name="key" type="string"/> 
     <element name="value" type="string"/> 
    </sequence> 
    </complexType> 
<!-- omitted --> 

이다

<definitions xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <types> 
    <xs:schema> 
     <xs:complexType name="Param"> 
     <xs:sequence> 
      <xs:element name="key" type="xs:string"/> <!-- 'xs:' to be added --> 
      <xs:element name="value" type="xs:string"/> <!-- 'xs:' to be added --> 
     </xs:sequence> 
     </xs:complexType> 
<!-- omitted --> 

문제는 몇몇 스키마의 속성 값 (<element>type, <extension>base)이 있다는 것이다 namespace-aware이며 위의 예에서 변경 될 수 있습니다. 볼 수 있듯이 DOM이나 SAX 파서는이 상황을 처리 할 수 ​​없으므로 현재 추한 문자열 연산을 사용하여 특정 속성 값에서 네임 스페이스 정보를 검색합니다.

내가 실종 됐어? 이러한 종류의 작업을 처리 할 수있는 API, 라이브러리 또는 기타 스키마 관련 도구가 있습니까?

+0

이것은 성가신 일입니다 ... 접두어는 요소 나 속성과 관련하여 한정된 이름의 일부가 아니지만 문자 데이터의 일부입니다. 파서는 본질적으로 그것을 인식하지 못합니다. 나는 한 번 질문했다 [당신의 문제를 생각 나게한다] (http://stackoverflow.com/questions/5634416/jaxb-bindings-file-namespace-aware-node-selection). 스키마 네임 스페이스에 속하는 요소에서 특정 속성의 내용 (예 :'type')을 처리하는 XSLT 스타일 시트를 통해 XML을 전달할 수 있습니다. –

+0

@G_H, 의견을 보내 주셔서 감사합니다. XSLT를 사용하는 것은 받아 들일 만 한 해결책으로 보인다. 특히 주제에 대한'jtahlborn'의 견해를 읽은 후에. – Osw

답변

3

예, xml schema/wsdl의 주요 버그입니다. 속성 값 내부의 xml 네임 스페이스 접두사를 사용하는 것은 큰 실수였습니다 (접두사 값 자체는 중요하지 않으므로 실제 네임 스페이스의 자리 표시 자만 사용). 불행히도, 나는 그 문제에 대한 좋은 해결책을 모른다. (나는 사실상 같은 생각을 구현해야했다. 여러 사용자 정의 스키마를 하나의 스키마/wsdl로 병합했다.) 나는 xerces가 xml schema model api이라는 것을 알고 있지만 여러 스키마를 병합하고 결과 출력을 생성 할 수 있는지 여부를 모르겠다.

1

SAX는 스키마 문서를 읽는 데 매우 낮은 수준입니다. XSLT와 같은 상위 인터페이스로 이동하면 많은 번거 로움을 없앨 수 있습니다. 스키마 문서를 스키마 구성 요소 모델로 변환하는 스키마 프로세서를 사용하여 스키마 문서를 읽는다면 더 많은 번거 로움을 없앨 수 있습니다. Xerces와 Saxon 모두이 작업을 수행 할 수 있으며 혼자가 아닙니다.

관련 문제