我是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,它的反射功能非常出色,所以即使在沒有獲取器和設置器的情況下也可以進行解析。試一試。
對於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>
更多信息
- 1. 使用JAXB解析XML
- 2. 使用JaxB解析XML的空響應
- 3. 使用JAXB解析未知Xml
- 4. 解析XML使用XPath來JAXB
- 5. 使用JAXB根據屬性解析xml
- 6. 使用jaxb的XML解析器
- 7. 使用JAXB解析XML字符串
- 8. 使用JAXB解析響應XML
- 9. 使用JAXB解析java的XML
- 10. 使用jaxb解析一個假xml
- 11. 使用jaxb解析xml字符串
- 12. 如何使用JAXB解析此xml
- 13. 在Matlab中解析xml(使用JAXB)
- 14. JAXB XML解析的問題
- 15. JAXB XML解析問題
- 16. 防止在JAXB XML解析
- 17. 使用AS2進行XML解析
- 18. 使用JDOM進行XML解析
- 19. 使用DocumentBuilder進行XML解析
- 20. 使用Ksoap進行Xml解析
- 21. 使用WP8進行XML解析
- 22. 使用R代碼進行XML解析
- 23. 使用XMLReader進行F#XML解析
- 24. 使用STAX API進行XML解析
- 25. xml使用2個表進行解析
- 26. 使用Powershell進行XML解析
- 27. 使用子節點進行XML解析
- 28. PubMed使用entrez_fetch進行XML解析rentrez
- 29. 使用SQL進行XML解析
- 30. 使用屬性進行XML解析
謝謝你,我會盡力的。 – thilo