문제

Java 객체 계층에서 XML 문서를 작성해야합니다. Java 클래스와 XML 형식은 모두 고정되어 있습니다. 따라서 XML 시리얼 라이저를 사용할 수 없습니다 xstream: XML 형식을 Java 클래스에 기초합니다. 마찬가지로, Java XML 바인딩 기술과 같은 JaxB XML 스키마에서 Java 클래스를 생성하기 때문에 작동하지 않습니다 [Ed : 그러나 아래 참조]. 수동 접근 방식이 필요합니다.

로우 테크 스트링 빌더 경로는 연약하고 버그가 많은 코드를 초래합니다 (적어도 나를 위해!).

API 좋아요 jaxp 또는 JDOM 훨씬 더 강력한 코드로 이어지지 만, 이것들은 꽤 장점입니다.

그루비 우아함이 있습니다 MarkupBuilder:

def writer = new StringWriter()
def xml = new MarkupBuilder(writer)
xml.records() {
  car(name:'HSV Maloo', make:'Holden', year:2006) {
    country('Australia')
    record(type:'speed', 'Production Pickup Truck with speed of 271kph')
  }
  car(name:'P50', make:'Peel', year:1962) {
    country('Isle of Man')
    record(type:'size', 'Smallest Street-Legal Car at 99cm wide and 59 kg')
  }
}

다른 언어 (예 : 루비) 순수한 자바와 함께 머물고 싶지만 더 나은 것을 가지고 있습니다. Java를위한 새로운 XML 빌더가있는 것 같습니다. 실용적인 XML 그리고 제임스 머티의 xmlbuilder.

Java에서 XML 문서를 구축하기위한 가장 우아한 접근법은 무엇입니까?

요약:

Jon Doe가 제안했습니다 dom4j 그리고 JDOM.

Curtaindog는 어쨌든 jaxb를 사용하여 권장했고 Jherico는 이것이 관련 제안이라는 점에서 저를 클리어 시켰습니다. 그런 다음 Dozer를 사용하여 현재 Javabeans와 Jaxb Javabeans 사이에 매핑 할 수 있습니다.

Thaggie는 추천합니다 Jibx 그리고 Curtaindog와 Jherico와 동의하여 바인딩 기술이 실제로 실용적이라고 동의했습니다.

Staxman은 추천합니다 Staxmate.

내가 보았던 것들 중에서, Practionxml과 James Murty의 XmlBuilder는 가장 간결한 건축업자 인 것 같습니다. JAXB와 같은 바인딩 기술은 추가 안전/자동화를 제공하는 것으로 보입니다. 주류 선택의 dom4j 여전히 부 장신이지만 괜찮아 보입니다. "유창한 인터페이스"를 제공합니다 (돌연변이터는 돌연변이 된 물체에 대한 참조를 반환하여 함께 묶을 수 있습니다).

public Document createDocument() {
    Document document = DocumentHelper.createDocument();
    Element root = document.addElement( "root" );
    Element author2 = root.addElement( "author" )
      .addAttribute( "name", "Toby" )
      .addAttribute( "location", "Germany" )
      .addText( "Tobias Rademacher" );
    Element author1 = root.addElement( "author" )
      .addAttribute( "name", "James" )
      .addAttribute( "location", "UK" )
      .addText( "James Strachan" );
    return document;
}

간결함을 위해이 API에 얇은 외관을 포장하여 이러한 방법 중 일부에 대해 간결한 동의어를 제공 할 수 있습니다 (예 : addattribute () 대신 attr ()).

감사합니다!

추신 : Stephan Schmidt는 Java에서 일했습니다 MarkupBuilder, 그러나 그것을 출판하지 않은 것 같습니다.

도움이 되었습니까?

해결책

dom4j 또는 jdom은 아마도 가장 우아 할 것입니다. 당신은 당신이 그것을 좋아하는 방식을 코드로 작성할 수 있습니다. 내가 기억한다면 Dom4J는 건축업자를 가지고 있으며, 그렇습니다. 코드는 더 장점입니다.

Element.addElement("x").setAttribute("x", "y").xxxxx;

다른 팁

보세요 xom. 빠르고 단순하고 정확하며 장황하지 않습니다.

어쨌든 jaxb를 사용하지 않는 이유는 무엇입니까? 그러면 문제는 객체 매핑에 매우 간단한 객체가되고 XML을 모두 피하십시오.

스크립팅 언어로 건축업자만큼 간결하지는 않지만 Staxmate 일을 아주 간단하게 만듭니다. 일반적으로 트리 모델이 구조적으로 단순하지만 유형의 추가 (암시 적 변환)를 추가로 지원합니다. 그리고 이것을 스트림으로 직접 직접 수행하는데, 이는 매우 낮은 메모리 사용량 (그리고 그것이 중요한 경우 고속)을 의미합니다.

가치가있는 것은 유창한 스타일 (2.0.x)을 지원합니다. 종종 의미가 있기 때문입니다. 전체 데이터 바인딩 (및 트리 모델) 솔루션에 대한 주요 이점은 아마도 메모리 사용량이 낮을 수 있습니다. 상태가 거의없고 모든 출력은 가능한 빨리 목적지로 나갑니다.

당신은 고려할 수 있습니다 Jibx, 당신은 a를 정의 할 수 있습니다 매핑 도메인 모델 클래스에서 대상 XML 스키마까지.

또는 불가능한 경우, 당신이 바인딩 기술을 사용하여 할인했다고 말하지만, 그 결정을 검토하는 것이 좋습니다. 도메인 모델에서 생성 된 모델로 복사하면 더 깨끗하고 유지 관리 가능하며 덜 가능성이 높습니다. 제안하는 것보다 오류가 발생하기 쉬운 코드 (Jibx도 할 수있는 것).

아마도 Jibx에 대한 질문을 경험 한 경험에 따르면 여기에서 열매는 없지만 메일 링리스트는 매우 도움이됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top