簡體   English   中英

將復雜的 XML 轉換為 Java 對象

[英]Convert complex XML to Java object

我有一個 xml,我想將特定標簽的子代形成的子 xml 保存到一個字符串中。 這是一個 xml 示例:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<SampleDTO>
    <id>1</id>
    <someList>
        <someObject>
            <amount>32</amount>
            <id>1</id>
            <someDescription>I am a description</someDescription>
        </someObject>
        <someObject>
            <amount>66</amount>
            <id>2</id>
            <someDescription>I am another description</someDescription>
        </someObject>
        <someObject>
            <amount>78</amount>
            <id>13</id>
            <someDescription>Guess what? I am a description</someDescription>
        </someObject>
    </someList>
    <otherList>
        <otherObject>
            <flag>true</flag>
            <id>1</id>
            <otherDescription>Oh nice, a description</otherDescription>
        </otherObject>
    </otherList>
</SampleDTO>

我想,例如傳遞“someList”,將 sub-xml 元素和值保存到一個字符串中,因為接下來我將它反序列化為一個 java 對象

使用 JAXB 解組器將 xml 文檔轉換為 java 對象。 首先將 JAXB 依賴項添加到項目的類路徑中。 欲了解更多信息

示例DTO.java

@XmlRootElement
public class SampleDTO {
    private String id;
    private List<SomeList> someList;
    private List<OtherList> otherList;

    @XmlElement
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @XmlElement
    public List<SomeList> getSomeList() {
        return someList;
    }
    public void setSomeList(List<SomeList> someList) {
        this.someList = someList;
    }
    @XmlElement
    public List<OtherList> getOtherList() {
        return otherList;
    }
    public void setOtherList(List<OtherList> otherList) {
        this.otherList = otherList;
    }
}

SomeList.java

@XmlRootElement
public class SomeList {
    private List<SomeObject> someObject;

    @XmlElement
    public List<SomeObject> getSomeObject() {
        return someObject;
    }
    public void setSomeObject(List<SomeObject> someObject) {
        this.someObject = someObject;
    }
}

其他列表.java

@XmlRootElement
public class OtherList {
    private List<OtherObject> otherObject;

    @XmlElement
    public List<OtherObject> getOtherObject() {
        return otherObject;
    }
    public void setOtherObject(List<OtherObject> otherObject) {
        this.otherObject = otherObject;
    }
}

對象.java

@XmlRootElement
public class SomeObject {
    private String amount;
    private String id;
    private String someDescription;

    @XmlElement
    public String getAmount() {
        return amount;
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
    @XmlElement
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @XmlElement
    public String getSomeDescription() {
        return someDescription;
    }
    public void setSomeDescription(String someDescription) {
        this.someDescription = someDescription;
    }
}

其他對象.java

@XmlRootElement
public class OtherObject {
    private String flag;
    private String id;
    private String otherDescription;

    @XmlElement
    public String getFlag() {
        return flag;
    }
    public void setFlag(String flag) {
        this.flag = flag;
    }
    @XmlElement
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    @XmlElement
    public String getOtherDescription() {
        return otherDescription;
    }
    public void setOtherDescription(String otherDescription) {
        this.otherDescription = otherDescription;
    }
}

使用 JAXB 解組

public class Main {
    public static void main(String[] args) {  
     try {
        File file = new File("file.xml");  
        JAXBContext jaxbContext = JAXBContext.newInstance(SampleDTO.class);  
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();  
        SampleDTO sampleDTO= (SampleDTO) jaxbUnmarshaller.unmarshal(file);  
      } catch (JAXBException e) {  
        e.printStackTrace();  
      }  
    }  
}

你的 java 類/對象應該至少有這 3 個實例變量:

private int amount
private int id
private String description

然后使用一些 xml 解析庫(例如jdom2 ),並且對於您迭代的每個<someObject>標記,初始化您的類的一個新對象並將從 xml (amount / id / description) 解析的值分配給它,並添加每個列表或數組等中新創建的對象。

有許多可用的開源 XML 處理包。 我喜歡傑克遜。 這是有關 Jackson XMLBaeldung 文章的鏈接

總結是這樣的:

  1. 將 Jackson 依賴項添加到您的 POM。
  2. 創建一個表示您的 xml 結構的對象結構。
  3. 創建一個 XmlMapper。
  4. 使用 XmlMapper。

暫無
暫無

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

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