gpt4 book ai didi

java - 使用 JAXB 解码 xml 项的嵌套列表

转载 作者:数据小太阳 更新时间:2023-10-29 02:14:46 25 4
gpt4 key购买 nike

我有这样的 xml 构造,我需要使用 JAXB 将其转换为 java 对象:

<elements>
<elemet>
<type></type>
<property1></property1>
<property2></property2>
<items>
<item>
<id></id>
<name></name>
</item>
...
<item>
<id></id>
<name></name>
</item>
</items>
</element>
</elements>

我不应该将此构造转换为具有嵌套项目列表的元素,而是转换为多个元素,每个元素一个。这是 Element 类的示例:

class Element {
Integer type;
String property1;
String property2;
Integer itemId;
String itemName;
}

我想在解码后得到它们的列表。所有列表元素的类型、属性 1 和属性 2 值应该相同。有没有可能使用 JAXB 解决这个问题?

最佳答案

主.java

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

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;


public class Main {

public static void main(String[] args) {

List<Element> elementList = new ArrayList<Element>();
List<Item> itemList = new ArrayList<Item>();
Element element1 = new Element();
Element element2 = new Element();
Item item1 = new Item();
Item item2 = new Item();
Elements elements = new Elements();

item1.setId(1);
item1.setName("Test1");
item2.setId(2);
item2.setName("Test2");
itemList.add(item1);
itemList.add(item2);

element1.setProperty1("prop1");
element1.setProperty2("prop2");
element1.setType(2);
element1.setItems(itemList);

element2.setProperty1("prop11");
element2.setProperty2("prop22");
element2.setType(22);
element2.setItems(itemList);

elementList.add(element1);
elementList.add(element2);

elements.setElements(elementList);

try {
System.out.println("------- Object to XML -----------\n");
JAXBContext jaxbContext = JAXBContext.newInstance(Elements.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

// output pretty printed
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

jaxbMarshaller.marshal(elements, System.out);

System.out.println("\n------- XML to Object -----------\n");

String xml = "<elements><element><items><item><id>1</id><name>Test1</name></item><item><id>2</id><name>Test2</name></item></items><property1>prop1</property1><property2>prop2</property2><type>2</type></element><element><items><item><id>1</id><name>Test1</name></item><item><id>2</id><name>Test2</name></item></items><property1>prop11</property1><property2>prop22</property2><type>22</type></element></elements>";
StringReader reader = new StringReader(xml);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Elements elementsOut = (Elements) jaxbUnmarshaller.unmarshal(reader);
System.out.println(elementsOut);

} catch (JAXBException e) {
e.printStackTrace();
}
}
}

元素.java

import java.lang.reflect.Field;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;


@XmlRootElement(name="elements")
public class Elements {

List<Element> elements;

@XmlElement(name="element")
public List<Element> getElements() {
return elements;
}

public void setElements(List<Element> elements) {
this.elements = elements;
}

@Override
public String toString() {
Field[] fields = this.getClass().getDeclaredFields();
String res = "";
try {
for (Field field : fields) {
res += field.getName() + " :\n" + field.get(this);
}
} catch (Exception e) {
e.printStackTrace();
}

return res;
}
}

元素.java

import java.lang.reflect.Field;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;

public class Element {

Integer type;
String property1;
String property2;
List<Item> items;

public Integer getType() {
return type;
}

public void setType(Integer type) {
this.type = type;
}

public String getProperty1() {
return property1;
}

public void setProperty1(String property1) {
this.property1 = property1;
}

public String getProperty2() {
return property2;
}

public void setProperty2(String property2) {
this.property2 = property2;
}

@XmlElementWrapper(name="items")
@XmlElement(name = "item")
public List<Item> getItems() {
return items;
}

public void setItems(List<Item> items) {
this.items = items;
}

@Override
public String toString() {
Field[] fields = this.getClass().getDeclaredFields();
String res = "\n";
try {
for (Field field : fields) {
res += field.getName() + " : " + field.get(this) + "\n";
}
} catch (Exception e) {
e.printStackTrace();
}

return res;
}
}

Item.java

import java.lang.reflect.Field;


public class Item {
Integer id;
String name;

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
Field[] fields = this.getClass().getDeclaredFields();
String res = "{";
try {
for (Field field : fields) {
res += field.getName() + " : " + field.get(this);
}
res += "}";
} catch (Exception e) {
e.printStackTrace();
}

return res;
}
}

因为 elements 标签是根元素,你不能使用 @XmlElementWrapper,但是 items 不是根元素,所以你可以使用它在那里,因此您不必实现 Items 类。忽略 toString 实现,它只是以有意义的方式打印对象。

对象到 XML 输出

--------对象到XML------------

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<elements>
<element>
<items>
<item>
<id>1</id>
<name>Test1</name>
</item>
<item>
<id>2</id>
<name>Test2</name>
</item>
</items>
<property1>prop1</property1>
<property2>prop2</property2>
<type>2</type>
</element>
<element>
<items>
<item>
<id>1</id>
<name>Test1</name>
</item>
<item>
<id>2</id>
<name>Test2</name>
</item>
</items>
<property1>prop11</property1>
<property2>prop22</property2>
<type>22</type>
</element>
</elements>

XML 到对象输出

------- XML to Object -----------

elements :
[
type : 2
property1 : prop1
property2 : prop2
items : [{id : 1name : Test1}, {id : 2name : Test2}]
,
type : 22
property1 : prop11
property2 : prop22
items : [{id : 1name : Test1}, {id : 2name : Test2}]
]

关于java - 使用 JAXB 解码 xml 项的嵌套列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25704853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com