使用 JAXB 解组多次出现的 XML 元素

Unmarshall XML element that occurs more than once using JAXB

我正在尝试将 XML 文档解组到我的模型中。问题是我有一个 XML 元素 <additional_detail> 在 XML 文档中出现不止一次。当我解组 XML 文档时,JSON 元素具有最后一次出现的 <additional_detail> 的值。我想要实现的是让它们全部以逗号分隔。

文档示例

.
.
.
<additional_detail>
 160cm
</additional_detail>
<additional_detail>
200KG
</additional_detail>
.
.
.

我的 java 模型中有:

@XmlElement(name = "additional_detail", namespace = NAME_SPACE)
private String additionalDetail;

希望下面的例子能帮到你

xml

    <Example>
    <detail>1</detail>
    <detail>2</detail>
    <detail>3</detail>
    </Example>

代码

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

public class JaxBUnmarshalExample {
    public static void main(String[] args) {
        try {
            File file = new File("file.xml");
            JAXBContext jaxbContext = JAXBContext.newInstance(Example.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Example que = (Example) jaxbUnmarshaller.unmarshal(file);
            System.out.println(que.details);
        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }

}

@XmlRootElement(name = "Example")
class Example { 
    List<String> details = new ArrayList<String>();
    String detail;  
    @XmlElement(name = "detail")
    public String getDetail() {     
        return detail;
    }
    /*
     here adding items in list later list can be used  
    */ 
    public void setDetail(String detail) {
        details.add(detail);
        this.detail = detail;
    }
}

如评论中所述,您应该使用 List 来捕获在 XML 中具有相同标签的所有信息。以下是显示类似 xml:

示例的示例

XML:

<root>
    <additional_detail>160cm</additional_detail>
    <additional_detail>200KG</additional_detail>
</root>

Parent.class:

@XmlRootElement(name = "root")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Parent {
    @XmlElement(name = "additional_detail")
    List<String> additional_detail;
}

Main.class:

public class Main {
    public static void main(String[] args) throws JAXBException, XMLStreamException {
        final InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("action.xml");
        final XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(inputStream);
        final Unmarshaller unmarshaller = JAXBContext.newInstance(Parent.class).createUnmarshaller();
        final Parent parent = unmarshaller.unmarshal(xmlStreamReader, Parent.class).getValue();
        System.out.println(parent.toString());

        Marshaller marshaller = JAXBContext.newInstance(Parent.class).createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(parent, System.out);
    }
}

如果你有这些列表的外部标签,比如 additional_details(注意 's'),那么你可以这样做:

<root>
    <additional_details>
        <additional_detail>160cm</additional_detail>
        <additional_detail>200KG</additional_detail>
    </additional_details>
</root>

Parent.class:

@XmlRootElement(name = "root")
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Parent {
    @XmlElementWrapper(name = "additional_details")
    @XmlElement(name = "additional_detail")
    List<String> additional_detail;
}