DOM解析XML文件时,会将XML文件的所有内容读取到内存中,然后允许您使用DOM API遍历XML树、检索所需的数据。使用DOM操作XML的代码看起来比较直观,并且,在某些方面比基于SAX的实现更加简单。
但是,因为DOM需要将XML文件的所有内容读取到内存中,所以内存的消耗比较大,特别对于运行Android的移动设备来说,因为设备的资源比较宝贵,所以建议还是采用SAX来解析XML文件,当然,如果XML文件的内容比较小采用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节点
-
for (int i = 0; i < personNodes.getLength(); i++) {
-
Person person = new Person();
-
//得到第一个person节点
-
Element personNode = (Element) personNodes.item(i);
-
//获取person节点的id属性值
-
person.id = (new Integer(personNode.getAttribute("id")));
-
-
//获取person节点下的所有子节点(标签之间的空白节点和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节点,然后从Text节点获取数据
-
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;
-
}
-
}
输出结果是:
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>
阅读(2452) | 评论(2) | 转发(1) |