Java解析XML文件——DOM解析

来源:互联网 发布:cstr在vb中什么意思 编辑:程序博客网 时间:2024/05/20 11:24

    DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过对
这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM接口的机制也被称作随机访问机制。
    DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制
表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
    DOM树所提供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树放在了内存中,
因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因此,DOM分析器还是有很广泛的使用价值的

具体示例:
(1)xml文件内容:在工程跟目录下建立xml/data1.xml文件,内容如下:
<students><student><name sex="man">小明</name><nickName>明明</nickName><age>20</age><address>北京</address></student><student><name sex="woman">小红</name><nickName>红红</nickName><age>20</age><address>上海</address></student><student><name sex="man">小亮</name><nickName>亮亮</nickName><age>30</age><address>广州</address></student><student-0><name sex="man">小亮-0</name><nickName>亮亮-0</nickName><age>200</age><address>广州-0</address></student-0></students>


(2) 解析:
private void parseXml() {long startTime = System.currentTimeMillis();System.out.println("开始解析: " + startTime);try {DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.parse(xmlFile);// 获得student的List, 注意:这里要用xml中student,而不是students节点NodeList studentList = doc.getElementsByTagName("student");for (int i = 0; i < studentList.getLength(); i++) {// 获得student标签Node node = studentList.item(i);// 获得student标签里面的标签NodeList childNode = node.getChildNodes();// 新建student对象Bean1 bean = new Bean1();// 遍历student标签里面的标签for (int j = 0; j < childNode.getLength(); j++) {Node item = childNode.item(j);if (item.getNodeName().equals("name")) {bean.setName(item.getTextContent());// 获取name节点的属性NamedNodeMap map = item.getAttributes();// 获取sex属性,由于只有一个属性,所以取0Node sexNode = map.item(0);bean.setSex(sexNode.getTextContent());} else if (item.getNodeName().equals("nickName")) {bean.setNickName(item.getTextContent());} else if (item.getNodeName().equals("age")) {bean.setAddress(item.getTextContent());} else if (item.getNodeName().equals("adress")) {bean.setAddress(item.getTextContent());}}datas.add(bean);}} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}long finishTime = System.currentTimeMillis();long time = finishTime - startTime;System.out.println("结束解析: " + finishTime + "\nDom解析耗时:" + time);for(Bean1 student : datas){System.out.println(student.toString());}}


demo传送门:

https://github.com/215836017/ParseXML_java

https://github.com/215836017/ParserXML_android


注:上面Java的demo中用到的xml文件是当前目录下的xml/data1.xml文件。result.xml是生成的文件。data2.xml, data3.xml是用来比较解析时间的。
    Android的demo中用到xml文件是存放在手机根目录下的data1.xml文件。