使用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解析

Jackson,以其JSON处理器而闻名,也有XML parsing support,它的反射功能非常出色,所以即使在没有获取器和设置器的情况下也可以进行解析。试一试。

+0

谢谢你,我会尽力的。 – thilo

对于JAXB,您应该为您可能动态获取的所有XML标签创建变量和相应的getter和setter。 如果您有一个标签(您可以动态获取),但在Java类中没有相应的映射变量,那么您将获得JAXB异常。因此,您可以在JAXB Java Class中定义一个标记,但是会在请求中提交,但是相反,标记未在JAXB Class中定义,但是在XML中引入会给您一个例外。

+0

是的,我知道,有没有其他方法可以做或者有其他的框架? – thilo

+0

我之前也使用过[XStream](http://xstream.codehaus.org/),但它也有与JAXB类似的限制。 – AurA

+0

是的,谢谢你的帮助。 – thilo

这将是动态的。解组调用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; 
    } 
} 
+0

我尝试过这种方式,而解组时,我们需要该元素的吸气剂,它是如何可能的?我尝试像公共元素getElement(){ return element; } ...结果为空 – thilo

+0

请参阅我的getElements更新 –

你可以充分利用@XmlAnyElementXmlAnyAttribute注释映射额外的内容。如果您不想要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> 

更多信息