2010-05-24 3 views
6

Java 6에서 전체 xerces XML 구문 분석기/직렬 변환기 구현은 이제 Java 런타임 (rt.jar)에 있습니다. 패키지가 com.sun. * 네임 스페이스 아래로 이동되었습니다.이 네임 스페이스는 클라이언트 코드 내에서 명시 적으로 참조 할 수 있도록 제한을 두지 않습니다. javax API 정의 팩토리를 통해 인스턴스화 된 파서를 사용할 때 이것은 문제가되지 않습니다.Java 6에서 xerces 직렬화

그러나 우리 코드는 xerces serialization (org.apache.xml.serialize. *)도 사용합니다. AFAICT에는, Serializer 및 OutputFormat의 인스턴스를 작성하기위한 javax.xml API 정의의 팩토리는 존재하지 않습니다. 이것은 하나를 얻는 유일한 방법은 명시 적으로 com.sun.org.apache.xml.serialize. * API를 호출하는 것입니다.

javax.xml.stream에서 직렬화 클래스를 찾았지만 xerces OutputFormat 클래스와 같은 출력 형식 컨트롤을 제공하지 않는 것 같습니다.

질문 :

는 xerces.jar을 포함하지 않고, 또한 명시 적으로 COM을 인스턴스화하지 않고 javax의 표준 API를 통해 (가의 rt.jar에서 임)의 Xerces 직렬화 기능에 액세스 할 수있는 방법이 있습니까. 태양. * 수업?

그렇지 않은 경우 동일한 효과를 얻을 수있는 javax API 호환 방법이 있습니까?

답변

5

java.* 또는 javax.* API를 통해 공개되지 않는 Xerces 기능을 사용하려면 Xerces를 타사 라이브러리로 포함하는 것이 유일한 해결책입니다. JRE 내부 버전의 Xerces에 액세스하는 것은 위험한 일입니다. 유효한 JRE에도 이러한 클래스가 있다고 보증 할 수는 없으므로 (대체 JRE 및 동일한 JRE의 다른 버전조차도 다른 구현을 사용하여 JAXP API를 구현할 수 있습니다. 그냥 다른 패키지로 옮기십시오).

+0

이것은 우리가 시작한 곳이며 우리가 결론을 내린 것입니다. Xerces의 비 Java-API 부분 (특히 직렬화)을 사용하려면 Xerces를 포함하는 방법이 없습니다. 우리는 코드베이스를 수정하여 시스템 속성에서 Xerces 클래스에 대한 명시적인 언급을 제거하고 파서와 변환기를 인스턴스화 할 때 기본값을 사용하도록했습니다. 모든 기본값이 com.sun에 있으므로 클래스 로딩 충돌을 방지해야합니다. * –

1

내가 아는 한이를 수행 할 공식 API는 없습니다. Java XML API는 이상하게도 XML을 구문 분석하기위한 것입니다.

그러나 XML 변환 API를 사용하여 DOM Document을 파일에 쓸 수는 있습니다. this example을 참조하십시오.

+0

지금 변환 API를 조사 중입니다. 그것은 커버 아래에있는 xerces 직렬화를 사용하지 않는 한 OutputFormat을 통해 사용할 수있는 형식 지정을 지정하는 유연성이없는 것 같으며 매개 변수를 serializer에 가져 오는 방법이 있습니다. –

0

javax.xml.bind.JAXBContext? 객체를 XML에 바인드/직렬화하려는 경우 JAXB가 표준입니다. 원시 구문 분석을 수행하는 경우 org.xml.sax 및/또는 org.w3c.dom에서 사용자가 원하는 내용을 찾아야합니다.

업데이트 : com.javax.transform 패키지가 도움이됩니다. 트랜스포머 예제 here을 살펴보십시오.

+0

아니요, Java 객체를 XML에 바인딩하지 않습니다. 이것은 단지 DOM을 직렬화하는 것에 불과하며 xerces/xalan 직렬화 API는 출력 형식 (들여 쓰기, 공백 등)에 대한 모든 제어를 제공하는 것 같습니다. –

1

sun API를 참조하고 싶지 않은 경우 Xerces를 승인 된 디렉토리에 배치 할 수 있습니다. 그것은 태양 복사/구현을 대체 할 것이지만 걱정없이 API를 사용할 수 있습니다 (이것은 이것을 수행하는 "공식적인"방법입니다).

Xerces 및 API 속성을 사용하여 출력을보다 잘 제어 할 수 있지만 Java 기본 제공 구현에서는 출력을 잘 제어 할 수 없습니다. API가 다른 구현에서 찾을 수있는 추가 속성을 전달할 수 있으므로 유능한. 마지막으로 나 자신을 시험해 보지 못했다.

편집 (주석에 대한 응답) : 기본 JDK를 제어하지 않는 환경에서 Xerces를 사용하여 JAXP에 대한 대체 API를 지정할 수있는 지점까지 Xerces를 참조해야합니다 직접 (또는 태양 패키지 재 작성 참조).

Xerces를 승인 된 디렉토리에 넣을 수 있거나 승인 된 설정을 무시할 수 있다면 (특히 Weblogic을 알지는 못했지만 솔직히 앱 서버에서는 그렇지 않을 것 같습니다) "JDK"방식으로 등록 정보를 기본 구현은 TransformerFactory.setAttribute을 통해 이루어지며 구현에 따라 Transformer.setParameter과 상호 작용할 수 있습니다.

sun 번들이 충분해야하는 기본 버전과 Weblogic에서 사용하는 경우 (또는 해당되는 경우 자체 Xerces를 사용하는 경우) 여기에 행운을 빕니다. 속성을 전달할 수 있어야합니다. 그것을 작동 시키십시오.

+0

우리는 endorsed 디렉토리를 사용 하겠지만, 우리는 매우 엄격한 보안 요구 사항을 가진 WebSphere 환경에서 WAR/EAR에 제품을 배치 할 수 있도록 노력하고 있습니다. API에서 기본 xerces 구현에 추가 속성을 전달할 수있는 가능성은 어디에서 확인할 수 있습니까? –

+0

@ 짐, 몇 가지 링크를 제공하기 위해 내 대답을 편집했습니다. – Yishai