2013-01-11 186 views
1

我是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解析

回答

-1

Jackson,以其JSON處理器而聞名,也有XML parsing support,它的反射功能非常出色,所以即使在沒有獲取器和設置器的情況下也可以進行解析。試一試。

+0

謝謝你,我會盡力的。 – thilo

1

對於JAXB,您應該爲您可能動態獲取的所有XML標籤創建變量和相應的getter和setter。 如果您有一個標籤(您可以動態獲取),但在Java類中沒有相應的映射變量,那麼您將獲得JAXB異常。因此,您可以在JAXB Java Class中定義一個標記,但是會在請求中提交,但是相反,標記未在JAXB Class中定義,但是在XML中引入會給您一個例外。

+0

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

+0

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

+0

是的,謝謝你的幫助。 – thilo

0

這將是動態的。解組調用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更新 –

0

你可以充分利用@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> 

更多信息