使用JAXB进行XML解析
我是xml解析的新手。我使用DOM来解析XML的练习。现在我想转移到其他XML解析框架。所以我选择了JAXB解析器。对于我的要求,我无法为所有xml标签创建getter setter。因为我会得到的xml是动态的。所以我不知道这些标签是用来创建getter/setter的。我参考了这个链接http://www.mkyong.com/java/jaxb-hello-world-example/。有没有什么办法可以解析而不需要创建getter和setter.Please让我清楚。使用JAXB进行XML解析
对于JAXB,您应该为您可能动态获取的所有XML标签创建变量和相应的getter和setter。 如果您有一个标签(您可以动态获取),但在Java类中没有相应的映射变量,那么您将获得JAXB异常。因此,您可以在JAXB Java Class中定义一个标记,但是会在请求中提交,但是相反,标记未在JAXB Class中定义,但是在XML中引入会给您一个例外。
这将是动态的。解组调用Customer.setElements;名帅称Customer.getElements
@XmlRootElement
class Customer {
@XmlAnyElement
public void setElements(List<Element> list) {
for (Element e : list) {
String name = e.getNodeName();
String value = e.getTextContent();
}
}
public List<Element> getElements() throws ParserConfigurationException {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
List<Element> list = new ArrayList<>();
Element e = doc.createElement("e1");
e.setTextContent("v1");
list.add(e);
return list;
}
}
我尝试过这种方式,而解组时,我们需要该元素的吸气剂,它是如何可能的?我尝试像公共元素getElement(){ return element; } ...结果为空 – thilo
请参阅我的getElements更新 –
你可以充分利用@XmlAnyElement
和XmlAnyAttribute
注释映射额外的内容。如果您不想要get
/set
方法,只需在班级中添加@XmlAccessorType(XmlAccessType.FIELD)
即可。
顾客
在类下面我们映射一个特定的XML属性和元素,然后使用@XmlAnyElement
注释映射可能出现的任何其它的元件,并且@XmlAnyAttribute
映射可能出现的任何其它属性。
import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
@XmlAttribute
int id;
@XmlAnyAttribute
Map<QName, String> otherAttributes;
String name;
@XmlAnyElement(lax=true)
List<Object> otherElements;
}
的input.xml
我们将解组在演示代码下面的XML文档。
<?xml version="1.0" encoding="UTF-8"?>
<customer id="123" status="good">
<name>Jane Doe</name>
<address>
<street>1 A Street</street>
<city>Any Town</city>
</address>
<phone-number>555-1111</phone-number>
</customer>
演示
以下内容将解组XML输入,所有所得到的对象的内容转储到System.out
和编组对象回XML。
import java.io.File;
import java.util.Map.Entry;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Customer.class, Address.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum14272453/input.xml");
Customer customer = (Customer) unmarshaller.unmarshal(xml);
// Mapped XML Attribute
System.out.println("customer.id");
System.out.println(" " + customer.id);
// Other XML Attributes
System.out.println("customer.otherAttributes");
for(Entry<QName, String> entry : customer.otherAttributes.entrySet()) {
System.out.println(" " + entry);
}
// Mapped XML Element
System.out.println("customer.name");
System.out.println(" " + customer.name);
// Other XML Elements
System.out.println(customer.otherElements);
for(Object object : customer.otherElements) {
System.out.println(" " + object);
}
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, System.out);
}
}
输出
下面是从运行演示代码的输出,注意所有的字段如何填充从XML文档中的数据。
customer.id
123
customer.otherAttributes
status=good
customer.name
Jane Doe
customer.otherElements
[email protected]
[phone-number: null]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="123" status="good">
<name>Jane Doe</name>
<address>
<street>1 A Street</street>
<city>Any Town</city>
</address>
<phone-number>555-1111</phone-number>
</customer>
更多信息
谢谢你,我会尽力的。 – thilo