문제

다음과 같은 노드가 있는 XML 문서를 구문 분석하고 있습니다.

<objects>
  <dog>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </dog>
  <cat>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </cat>
</objects>

data1, data2, data3 요소는 항상 일관됩니다.상위 태그만 다릅니다.내 개체 모델에는 이러한 모든 경우를 나타내는 단일 개체가 있습니다.요소 이름을 미리 알지 못한 채 JAXB가 이 경우를 처리하도록 하려면 어떻게 해야 합니까?

@XMLAnyElement는 모든 객체와 일치하지만 적절한 유형의 객체를 생성하지 않습니다.내 개체 대신 Node 개체 목록을 얻습니다.내 개체는 현재 다음과 같습니다.

public class MyObject {
    protected String otherData;

    @XmlAnyElement
    @XmlElementWrapper(name = "objects")
    protected List<MyChildObject> childObjects;
}

public class MyChildObject {
    protected String data1;
    protected String data2;
    protected String data3;
}

사용할 들어오는 XML 형식을 변경하지 않고 이 사례를 처리하는 방법에 대한 아이디어가 있습니까? <object type="dog"> 강요?

도움이 되었습니까?

해결책

이름이 진실한 역동적이라면 JaxB가 도움이 될 것이라고 생각하지 않습니다. 다양한 요소 이름이 정의 된 경우 제안 된 다른 게시물과 같이 상속을 사용할 수 있습니다. 요소와 이름의 수를 알 수없는 경우 다음과 같은 것을 사용하는 것이 좋습니다.

@XmlMixed
@XmlAnyElement
public List<Object> getObjects() {
    return objects;
}

이것은 요소가 단지 DOM 요소입니다. 그런 다음 JAXB를 두 번째로 사용하여 각 요소에서 사용자 정의 유형으로 이동할 수 있습니다.

JaxB를 사용해야한다면입니다. 이와 같은 데이터에 직접 색소폰 또는 DOM API를 사용하는 것이 더 쉬울 수 있습니다. JAXB는 실제로 스키마로 표시 될 수있는 잘 정의 된 데이터를위한 것입니다.

다른 팁

상속을 사용할 수 있습니다.

@XmlRootElement(name = "dog")
public class MyDogObject extends MyChildObject {
    //nothing here
}

@XmlRootElement(name = "cat")
public class MyCatObject extends MyChildObject {
    //nothing here
}

이렇게 하면 동일한 객체 유형을 처리할 수 있습니다. MyChildObject, XML 구조를 유연하게 제어할 수 있습니다.또 다른 이점은 나중에 특정 개/고양이 XML 노드를 정의해야 한다는 것입니다. 예상대로 해당 하위 클래스에는 매핑될 수 있지만 다른 클래스에는 매핑될 수 없습니다.

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