使用JAXB对出现多次的XML元素进行编组



我试图将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;
}

最新更新