DOM解析XML文件時,會將XML文件的所有內(nèi)容讀取到內(nèi)存中,然后允許您使用DOM API遍歷XML樹、檢索所需的數(shù)據(jù)。使用DOM操作XML的代碼看起來比較直觀,并且,在某些方面比基于SAX的實現(xiàn)更加簡單。
但是,因為DOM需要將XML文件的所有內(nèi)容讀取到內(nèi)存中,所以內(nèi)存的消耗比較大,特別對于運行Android的移動設(shè)備來說,因為設(shè)備的資源比較寶貴,所以建議還是采用SAX來解析XML文件,當(dāng)然,如果XML文件的內(nèi)容比較小采用DOM是可行的。
下面是一個使用DOM解析xml的例子:
- import java.io.File;
-
import java.io.FileInputStream;
-
import java.io.FileNotFoundException;
-
import java.io.InputStream;
-
import java.util.ArrayList;
-
import java.util.List;
-
-
import javax.xml.parsers.DocumentBuilder;
-
import javax.xml.parsers.DocumentBuilderFactory;
-
-
import org.w3c.dom.Document;
-
import org.w3c.dom.Element;
-
import org.w3c.dom.Node;
-
import org.w3c.dom.NodeList;
-
-
public class DOM_XML_Parser {
-
-
/**
-
* @param args
-
*/
-
public static void main(String[] args) {
-
File file = new File("C:/studentInfo.xml");
-
try {
-
List<Person> personList = readXML(new FileInputStream(file));
-
if(personList != null) {
-
for(Person p : personList) {
-
System.out.println(p);
-
}
-
} else {
-
System.out.println("list null");
-
}
-
} catch (FileNotFoundException e) {
-
e.printStackTrace();
-
}
-
}
-
-
public static List<Person> readXML(InputStream inStream) {
-
List<Person> persons = new ArrayList<Person>();
-
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
-
try {
-
DocumentBuilder builder = factory.newDocumentBuilder();
-
Document dom = builder.parse(inStream);
-
Element root = dom.getDocumentElement();
-
NodeList personNodes = root.getElementsByTagName("person");//查找所有person節(jié)點
-
for (int i = 0; i < personNodes.getLength(); i++) {
-
Person person = new Person();
-
//得到第一個person節(jié)點
-
Element personNode = (Element) personNodes.item(i);
-
//獲取person節(jié)點的id屬性值
-
person.id = (new Integer(personNode.getAttribute("id")));
-
-
//獲取person節(jié)點下的所有子節(jié)點(標(biāo)簽之間的空白節(jié)點和name/age元素)
-
NodeList childsNodes = personNode.getChildNodes();
-
for (int j = 0; j < childsNodes.getLength(); j++) {
-
Node node = (Node) childsNodes.item(j);
-
//判斷是否為元素類型
-
if(node.getNodeType() == Node.ELEMENT_NODE){
-
Element childNode = (Element) node;
-
//判斷是否name元素
-
if ("name".equals(childNode.getNodeName())) {
-
//獲取name元素下Text節(jié)點,然后從Text節(jié)點獲取數(shù)據(jù)
-
person.name = (childNode.getFirstChild().getNodeValue());
-
} else if ("age".equals(childNode.getNodeName())) {
-
person.age = (new Short(childNode.getFirstChild().getNodeValue()));
-
}
-
}
-
}
-
persons.add(person);
-
}
-
inStream.close();
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
return persons;
-
}
-
}
輸出結(jié)果是: id=23 name=LiMing age=30 id=20 name=XiaoZhang age=25
需要解析的XML文件如下: - <?xml version="1.0" encoding="UTF-8"?>
-
<persons>
-
<person id="23">
-
<name>LiMing</name>
-
<age>30</age>
-
</person>
-
<person id="20">
-
<name>XiaoZhang</name>
-
<age>25</age>
-
</person>
-
</persons>
|