Java开发

解析XML文件的方式(二)之DOM

2020-02-01  本文已影响0人  风中小酌

0、要处理的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <book id="1001">
        <name>JAVA 高级编程</name>
        <author>张三</author>
        <price>85.72</price>
    </book>
    <book id="1002">
        <name>C++和C#</name>
        <author>李失失</author>
        <price>125.73</price>
    </book>
</books>

1、DOM方式解析XML数据的步骤

a. 创建一个DocumentBuilderFactory对象
b. 创建一个DocumentBuilder对象
c. 通过DocumentBuilder的parse()方法,得到Document对象
d. 通过getElementsByTagName()方法,获取节点的列表
e. 使用for循环遍历节点
f. 得到所有节点的属性和属性值
g. 得到所有节点的节点名和节点值

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class TestDom4Xml {
    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
        //创建一个DocumentBuilderFactory对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        //创建一个DocumentBuilder对象
        DocumentBuilder db = dbf.newDocumentBuilder();
        //通过DocumentBuilder的parse()方法,得到Document对象
        Document doc = db.parse("book.xml");
        //通过getElementsByTagName()方法,获取节点的列表
        NodeList nodelist = doc.getElementsByTagName("book");
        System.out.println(nodelist.getLength());
        //使用for循环遍历节点
        for(int i=0;i<nodelist.getLength();i++){
            Node node = nodelist.item(i);
            //得到所有节点属性和属性值的对象
            NamedNodeMap nnm = node.getAttributes();
            for(int j=0;j<nnm.getLength();j++){
                Node sub_node = nnm.item(j);
                //得到所有节点的属性和属性值
                System.out.println(sub_node.getNodeName() + " : " + sub_node.getNodeValue());
            }
            //得到所有节点的子节点
            NodeList childlist = node.getChildNodes();
            for(int j=0;j<childlist.getLength();j++){
                Node sub_node = childlist.item(j);
                //获取节点类型
                short type = sub_node.getNodeType();
                //判断节点类型是否不为#text,因会将前一标签的末尾>与下一标签的开头<之间的字符,标记为#text
                //因此这里需要进行判断
                if(type == Node.ELEMENT_NODE){
                    //得到所有节点的节点名和节点值
                    System.out.println(sub_node.getNodeName() + " : " + sub_node.getTextContent());
                }
            }
        }
    }
}

2、输出结果如下

2
id : 1001
name : JAVA 高级编程
author : 张三
price : 85.72
id : 1002
name : C++和C#
author : 李失失
price : 125.73
上一篇下一篇

猜你喜欢

热点阅读