2009-11-26 2 views
3

올바른 용어가 무엇이든 개체, 트리/모델/계층 구조가 있습니다. 이는 원하는 XML의 일대일 매핑으로 특징 지어 질 수있는 것으로 구성됩니다.개체 계층 구조에서 XML을 어떻게 생성 할 수 있습니까?

내가 가지고 있다는

class A { 
    class B b[*] 
    class C 
    class D 
} 

class B { 
    class C c[*] 
    string AttributeFoo = "bar" 
} 

class C { 
    string AttributeThis = "is" 
} 

class D { 
    string AttributeName = "d" 
} 

원하는 출력이 같은 것입니다 (구문의 비 표준 UML 정렬에서) 다음 : 당신이 로 제안 할 것이 무엇

<?xml version="1.0"?> 
<a> 
    <b attribute-foo="bar"> 
     <c attribute-this="is"/> 
    </b> 
    <c attribute-this="is"/> 
    <d attribute-name="d"/> 
</a> 

가장 좋은 및/또는 가장 단순한 이러한 목표를 달성하는 방법은 무엇입니까?

답변

3
가) 당신이 표준 라이브러리에 그것을 얻을 수 있기 때문에 내가 JAXB 볼 것

그리고 b) 그것은 그렇게 복잡하지 않습니다. 이 코드는 자바 6이 필요합니다

@XmlRootElement public static class A { 
    public List<B> b = new ArrayList<B>(); 
} 

public static class B { 
    public List<C> c = new ArrayList<C>(); 
    @XmlAttribute(name = "attribute-foo") public String attributeFoo = "foo"; 
} 

public static class C { 
    @XmlAttribute(name = "attribute-this") public String attributeThis = "is"; 
} 

public static void main(String[] args) { 
    A a = new A(); 
    a.b.add(new B()); 
    a.b.get(0).c.add(new C()); 
    JAXB.marshal(a, System.out); 
} 
//TODO: getters/setters, error handling and so on 

출력 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<a> 
    <b attribute-foo="foo"> 
     <c attribute-this="is"/> 
    </b> 
</a> 
+0

이것은 실제로 유망 해 보입니다. 나는 이것이 JAXB를 사용하는 것이 훨씬 어려웠다는 인상을 받았다. –

+0

이것은 완벽한 경기로 밝혀졌습니다! 시간을내어 사용법을 설명해 주셔서 감사합니다. 내가 말했듯이 그것이 이보다 훨씬 큰 과제라고 생각했다. –

3

가장 간단한 방법은 XStream입니다. 무슨 일을하는지에 대해서는 here을 참조하십시오. 그것은 약간의 버그가 될 수 있지만, 간단한 작업을 위해 그것의 위대한. 보다 포괄적 인 (그리고 신뢰할 수있는) 기술을 위해서는 JAXB (Java6의 일부인 javax.xml.bind 참조)가 더 좋습니다.

+0

방법이 내가 필요한 속성의 유형을 생성 할 수 있습니다? –

+0

http://xstream.codehaus.org/alias-tutorial.html의 "속성 앨리어싱"섹션을 참조하십시오. – skaffman

+0

간단히 말하자면이 예제에서 작동하지만 실제로는 내 전체 환경에서 실행 가능한 솔루션이 아닙니다. 계획. 그럼에도 불구하고 좋은 해결책입니다. –

2

공구를 사용하려면 jaxb을보십시오. Marshalling/Unmarshalling은 여기서하고있는 일이며 많은 솔루션을 사용할 수있는 일반적인 문제입니다.

는 나는 (바퀴를 개혁하지 않음) 최고의 생각 그것은 단순한이야 (I 수동으로 수행했는데 정말 재미 없습니다 - 객체 그래프가 순환 될 수 있습니다 ...)

+0

네, 재발 명은 좋은 것이 아닙니다. 바로 제가 묻는 이유입니다. –

1

제 의견으로는 성능에 너무 신경 쓰지 않는다면 Jaxb에서 벗어나 더 간단한 프레임 워크를 살펴 보겠습니다. 성능이 문제인 경우 대부분의 상황에서 jaxx보다 jaxb를 선호합니다.

이 경우 나는 간단한 프로젝트를 사용하는 경향이 있습니다.

http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php#start

그냥 :-) ..... 당신이 가서 멀리 떨어져 개체 모델에 주석을 달고

@Root 
public class Example { 

    @Element 
    private String text; 

    @Attribute 
    private int index; 

    public Example() { 
     super(); 
    } 

    public Example(String text, int index) { 
     this.text = text; 
     this.index = index; 
    } 

    public String getMessage() { 
     return text; 
    } 

    public int getId() { 
     return index; 
    } 
} 
+0

흥미로운 접근 방식이지만 그 논리는 내게 어필하지 않습니다. –

관련 문제