2011-04-10 69 views
3

我目前正在學習Java以及如何處理XML數據。我一直在學習如何使用Java SAX來將我的xml數據解析爲java對象。這個XML文檔可以更改並添加額外的子項(例如:Birthday,height ...)。那麼處理這個XML文檔的最佳建議是什麼?我被告知要使用對象是這樣的:爲每個XML子節點動態創建Java對象?

Object1.ID 
Object1.Emp_Id 
Object1.Emp_Name 
... 
Object2.ID 
Object2.Emp_Id 
Object2.Emp_Name 

如果XML接收到一個新的孩子,就像生日,那麼應用程序將其添加到對象,例如:

Object1.ID 
Object1.Emp_Id 
Object1.Emp_Name 
Object1.Birthday 

有人能指出我正確的方向,我可以動態地創建像上面的例子那樣的新對象,我可以將子節點放入?所以如果孩子節點改變了,我不必直接指定它呢?對不起,我不知道如果我解釋這個權利。我正在學習SAX並找到了本教程,但似乎沒有解釋我想要做什麼:Mapping XML to Java Objects

感謝yoU!

XML文件:

<?xml version = "1.0" ?> 
<Employee-Detail> 

<Employee> 
<ID no="1"> 
<Emp_Id> E-001 </Emp_Id> 
<Emp_Name> Vinod </Emp_Name> 
<Emp_E-mail> [email protected] </Emp_E-mail> 
<Sex>Male</Sex> 
<Age>25</Age> 
</ID> 
</Employee> 

<Employee> 
<ID no="2"> 
<Emp_Id> E-002 </Emp_Id> 
<Emp_Name> Amit </Emp_Name> 
<Emp_E-mail> [email protected] </Emp_E-mail> 
<Sex>Male</Sex> 
<Age>21</Age> 
</ID> 
</Employee> 
</Employee-Detail> 

回答

0

基本上有兩種方法可以做到這一點。首先,您可以定義名稱映射到XML元素的Java類。你可以手工完成,或者你可以使用像XmlBeans這樣的工具(還有很多其他的工具)。兩者都是相同的:你必須事先了解關於XML的一些東西。

另一種方法是不使用專用類,而是使用某種具有「名稱」屬性,屬性映射和子級列表的通用「樹節點」對象。文檔對象模型(Document Object Model,DOM)是其標準版本,實際上,使用自動構建此樹的DOM解析器是使用SAX的標準替代方案。您也可以創建自己的通用元素類,但您應該先使用DOM嘗試它,以瞭解它如何適用於您的應用程序。

+1

這不是那種地方JAXB眼前一亮的東西? – 2011-04-10 02:40:37

+0

感謝您的輸入,我會知道元素將如何配置,它只是我試圖解決的子節點。子節點名稱可以不同,因爲它們將由用戶創建,但所有父節點將相同以幫助應用程序導航文檔。 – 2011-04-10 02:57:05

4

我個人非常喜歡使用JAXB。

您可以將該示例XML傳遞給XML模式(XSD)生成器。然後採用XSD並使用XJC工具生成Java對象。生成Java對象後,可以分別使用Marshaller和Unmarshaller類編組(保存/導出/寫入)XML或解組(裝載/導入/讀取)它。

曾經有一個在線的XML到XSD轉換器,在http://www.flame-ware.com/products/xml-2-xsd/,但它似乎在下降。不過,您可以免費下載Visual Studio的快速版本來完成相同的任務。

我喜歡這個教程JAXB:http://download.oracle.com/javaee/5/tutorial/doc/bnbah.html

我通常使用SAX解析只如果我想在爲我解析多數民衆贊成解析(幾乎沒有)的一切完全控制。

我不喜歡使用DOM方法,因爲它需要先解析整個XML文檔,然後才能真正對其進行解析,並且一旦解析完成,您需要做更多工作來配置解析器/ XML使用者知道這些領域實際上是做什麼的。

至於你的動態孩子,我只是簡單地在模式中包含代表鍵值對的無限數量的對象。由於爲您生成的所有代碼,它仍然可以節省您的時間。

XMLBeans的圖書館類似,JAXB,但我更喜歡後者,因爲它被引導到Java的核心釋放,同時XmlBeans的不是。

+0

問題:我可以像JAXB或SAX一樣使用嵌套向量嗎?我只是發現矢量可以被命名爲任何東西,並可以爲每個矢量對象保存任何東西。 (不知道我是否正確解釋)。例如:創建一個矢量變量來保存一個xml元素父級名稱。在該向量varialble中,我爲該父項中的所有子項創建另一個向量。所以我可以實現Object1.child1,Object1.child2,Object1.child3 ...等等。 – 2011-04-10 05:41:45

+0

使用JAXB,您也可以從對象開始,這意味着模式不是必需的。還Java是一個標準(JSR-222),具有多個實現(新城,的EclipseLink MOXY,阿帕奇JaxMe),這就是爲什麼它被包含在Java SE 6.本標準的發展包括從XMLBeans的一個代表,以及其他對象-to-XML工具。 – 2011-04-10 10:55:04

+0

JAXB本地支持鍵值對的映射。所以是的,你可以嵌套=)。看看XMLAdapter。 另外,好的補充,Blaise! – 2011-04-11 07:37:24

1

另一種選擇是XStream的:http://x-stream.github.io/。它不如JAXB靈活,但它的優點是不需要太多配置。

在你的情況你只需創建一個類:

public class Employee { 
    String Id; 
    String EmpId; 
    ... 
} 

XStream xstream = new XStream(); 
xstream.alias("Employee", Employee.class); 
xstream.useAttributeFor(Employee.class, "ID"); 
xstream.aliasField("no", Blog.class, "ID"); 
Employee e = (Employee)xstream.fromXML(xml); 

這是一個有點痛,不過,如果你的XML不乾淨映射到你的對象。

+0

但這種方法將意味着我將不得不仍然知道孩子標籤在xml文件中,對嗎?我希望能夠根據文件中的子標籤動態創建對象。 – 2011-04-10 04:00:38

+0

如果你映射到一個特定的XML格式沒有在配置多大的區別:http://bdoughan.blogspot.com/2010/10/how-does-jaxb-compare-to-xstream.html – 2011-04-10 10:57:36

+0

我不不懂「動態創建」。只要子標籤與現有的類/字段名稱約定匹配,XStream就會爲您實例化並映射。 – Dave 2011-04-13 03:14:42