JAXB를 사용하여 가변/동적 이름을 가진 요소의 정렬을 해제합니다.
-
08-07-2019 - |
문제
다음과 같은 노드가 있는 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 노드를 정의해야 한다는 것입니다. 예상대로 해당 하위 클래스에는 매핑될 수 있지만 다른 클래스에는 매핑될 수 없습니다.