2009-07-02 7 views
0

JAXB로 비 정렬 화하는 동안 XML 문서를 형식화하려고합니다. 하나를 통해 코드를 포맷 할 수 있습니다 마샬링 동안비 정렬 화 중에 JAXB를 사용하여 XML 형식화

Unmarshaller u = createAndsetUpUnmarshaller(enableValidation, evtHandler, clazz); 
return u.unmarshal(new ByteArrayInputStream(stringSource.getBytes())); 

: ... unmarchal 프로세스

marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 

그러나이 밤은 수를 어떤 생각을 나는 XML 문자열을 포맷 할 수있는 방법처럼 비 정렬 화 보인다 비 정렬 프로세스 동안 또는 후에 JAXB와 함께?

여기에 예쁜 프린트에 대한 게시물을 읽었지만 JAXB로하고 싶습니다!

+4

언 마샬로 인해 개체 인스턴스가 생성되지 않습니까? –

+0

네, 그렇습니다 ... hm – Tobias

+0

그럼, 무엇을 포맷 하시겠습니까? –

답변

27

그것을 비 정렬하는 동안 XML 코드를 포맷?이 작업을 수행하는

+0

24 upvotes and accepted ... astounding. 놀라운. –

2

JAXB unmarshaller의 결과가 XML이 아니라 Java 객체이기 때문에 Unmarshaller에는 예쁜 인쇄물이 없다고 생각합니다. 결과적으로 생성 된 비 정렬 화 된 오브젝트를 꽤 인쇄하고 싶은 경우는, jaxb 생성 객체의 toString() Methods를 오버 라이드 (override)하는 것이 좋습니다. (이것은 당신이 JAX 바인딩 클래스를 생성 할 때마다 지저분한 해결책이 될 것입니다.

흠 ... 나는 JAXB의 향후 버전이이 단점에 대한 해결책을 갖기를 희망합니다. 그것은, 로깅을위한 중요하기 때문에 등

0

한 가지 방법은, 당신이 주장하는 경우, 사용하는 같은 색슨의 같은 XSLT 변압기이며, 논리적으로 무의미하다 , "teeing"을 지원합니다. 즉, Source를 두 개의 Result 객체로 변형 할 수 있습니다. String # getBytes()를 호출하는 이유를 알지 못해서 StringReader를 만들고 그로부터 꺼내야합니다. "tee"는 "신원 변환"(TransformerFactory # newTransformer()를 호출하면 기본값)이고 다른 하나는 JAXBResult가됩니다.

17

방금 ​​비 정렬화한 XML에 해당하는 형식화 된 XML을 기록하려면 지정한 속성을 사용하여 XML로 다시 정렬 해제하면됩니다. 당신이 원하는 모두가 XML 포맷 인 경우 한편

/** 
* Marshall input object to a formatted XML String 
*/ 
protected <T> String marshal(T input) throws JAXBException { 
    StringWriter writer = new StringWriter(); 

    JAXBContext jc = JAXBContext.newInstance(input.getClass()); 
    Marshaller marshaller = jc.createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE); 
    marshaller.marshal(input, writer); 
    return writer.toString(); 
} 

는, 당신은 아마 대신 JAXB의 JAXP를 이용해야한다.

관련 문제