使用 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;
}
我正在尝试将 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;
}