簡體   English   中英

將 XML 映射到與 XML 結構不匹配的 Java 對象

[英]Mapping XML to Java object that doesn't match XML structure

我從對遺留系統的調用中獲得了一個平面 XML 文檔,我希望能夠使用注釋將它解組為多個 Java 對象(理想情況下)。

XML 沒有 xsd,我想維護我的 Java 類的當前結構,因為它們映射到我從我的 restful 服務返回的 JSON 的結構。

我已經看到使用 MOXy 反向處理這個問題的例子,但沒有這個問題的例子。

所以給...

    <xml>
        <body>
            <a>A</a>
            <b>B</b>
            <c>C</c>
            <d>D</d>
            <e>E</e>
        </body>
    </xml>

我想將這些值映射到

    public class wrapper {

        private Object1 one;
        private Object2 two;
        private Object3 thr;
    }

    public class Object1 {

        private String a;
        private String b;

    }

    public class Object2 {

        private String c;
        private String d;
    }

    public class Object3 {

        private String e;
    }

這樣做的明顯的、長期的方法是手動解析 XML 文檔,檢索文本節點值並將它們設置在我的 java 對象上,但我試圖避免這種情況,因為 XML 相當大,我將不得不重復該過程為多項服務。

任何需要大量手動處理的解決方案都會讓我很難證明偏離當前的長手方法是合理的。

提前致謝

相關 MOXy 功能

MOXy 目前支持使用@XmlPath(".")將子對象的映射屬性直接寫入父對象元素(參見: http : @XmlPath(".") ) .

你的用例有什么有趣的地方

使您的用例變得棘手的是,您在示例中增加了嵌套級別。 我們今天不直接支持這一點,但我添加了一個增強請求(參見: http : //bugs.eclipse.org/432029 )。 實施后,您將能夠執行以下操作:

@XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class wrapper {

    @XmlPath("body")
    private Object1 one;

    @XmlPath("body")
    private Object2 two;

    @XmlPath("body")
    private Object3 thr;

}

解決

使用當前功能,您可以執行以下操作:

Java模型

@XmlRootElement(name="body")
@XmlAccessorType(XmlAccessType.FIELD)
public class wrapper {

    @XmlPath(".")
    private Object1 one;

    @XmlPath(".")
    private Object2 two;

    @XmlPath(".")
    private Object3 thr;

}

演示

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource source = new StreamSource("input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(source);
        while(!(xsr.isStartElement() && "body".equals(xsr.getLocalName()))) {
            xsr.next();
        }

        JAXBContext jc = JAXBContext.newInstance(wrapper.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        wrapper result = (wrapper) unmarshaller.unmarshal(xsr);
     }

}

想要查詢更多的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM