1. 程式人生 > >java實現xml文件讀取並保存到對象

java實現xml文件讀取並保存到對象

數據封裝 itl imp get return 配置文件 targe dom4j xml配置

首先淺聊一下解析xml的四種方式:

1.DOM方式:有缺點但是這個缺點卻也是他的優點。下面詳細介紹:

以樹形的層次結構組織節點或信息片斷集合,可以獲得同一個文檔中的多處不同數據。使用起來簡單。

優點是:可以獲得同一個文檔中的多處不同數據,使用起來簡單。

缺點是:需要加載整個xml文件,這對內存和資源有一定的消耗,如果是小型的xml文件可以嘗試用 DOM方式解析。

經測試當用DOM方式讀取大小為10M的文件時, 將會產生內存溢出異常。

2.SAX方式:在讀取數據時檢查數據,不用解析整個文檔,因此不需要將數據存儲在內存中。可以避免DOM方式中的內存溢出。

優點:不用考慮在xml文檔在加載時的內存消耗過大。

缺點:在用SAX解析器的時候編碼工作會比較困難,而且很難同時訪問同一個文檔中的多處不同數據。

3.DOM4J方式:DOM4J性能最好,連Sun的JAXM也在用DOM4J.目前許多開源項目中大量采用DOM4J,例如大名鼎鼎的hibernate也用DOM4J來讀取XML配置文件。考慮可

DOM4J的可移植性不好。

4.JDOM方式: JDOM自身不包含解析器。它通常使用SAX2解析器來解析和證輸入XML文檔

下面是用DOM方式實現xml文件的讀取並轉化為Java類對象:

DOM方式:

xml文件代碼 xmlPojo.xml:

<?xml version="1.0" encoding="UTF-8"?>
<items>
<item id="328">
<name>name1</name>
<size>23</size>
</item>
<item id="303">
<name>name2</name>
<size>22</size>
</item>
</items>

xml文件內容對應的java類:

public class XmlPojo{

String id;

String name;

String size;

......

setter AND getter 方法

}

xml讀取的實現類:

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class DomTest {

public static void main(String[] args) {
List<XmlPojo> list = new DomTest().parseXmlPojo();
//打印讀取的結果。
for (XmlPojo p : list) {
System.out.println(p);
}

}

//解析xml文件,並把結果封裝至XmlPojo的集合中返回
private List<XmlPojo> parseXmlPojo() {
List<XmlPojo> xmlPojoList = null;
try {
//獲得dom制造工廠
DocumentBuilderFactory factory = DocumentBuilderFactory
.newInstance();
//獲得dom解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//獲得xml文件的輸入流
InputStream inStream = DomTest.class.getClassLoader()
.getResourceAsStream("xmlPojo.xml");
//通過解析器得到Document對象
Document document = builder.parse(inStream);
//得到要獲取的所有item 結點,通過每個結點,獲取每個item的內容數據。
NodeList list = document.getElementsByTagName("item");
xmlPojoList = new ArrayList<XmlPojo>();
XmlPojo xmlPojo= null;
//遍歷person集合,將數據封裝於xmlPojo對象中
for (int i = 0, size = list.getLength(); i < size; i++) {
xmlPojo = new XmlPojo();
//得到<person>結點
Element e = (Element) list.item(i);
//獲取其id屬性
String id = e.getAttribute("id");
xmlPojo.setId(Integer.valueOf(id));
//得到當前<person>結點的所有孩子結點。
NodeList chileList = e.getChildNodes();
//遍歷所有孩子結點,以便獲得其余數據。
for (int j = 0, csize = chileList.getLength(); j < csize; j++) {
Node node = chileList.item(j);
switch (node.getNodeName()) {
case "name":
//當結點為<name>時,獲取內容,並給xmlPojo賦值
String name = node.getTextContent();
xmlPojo.setName(name);
break;
case "size":
//當結點為<age>時,獲取內容,並給xmlPojo賦值
String size = node.getTextContent();
xmlPojo.setSize(Integer.valueOf(size));
break;
}
}
//完成一個<xmlPojo>結點的遍歷,將xmlPojo對象加入集合中。
xmlPojoList.add(xmlPojo);
//清空xmlPojo對象的數據。
xmlPojo = null;
}

} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//返回最終得到的數據。
return xmlPojoList;
}
}

java實現xml文件讀取並保存到對象