xml解析-jaxp-dom方式

总结一下xml文件的一种解析方式jaxp,先说一下解析的过程:
1. 创建解析器工厂
2. 创建解析器
3. 解析xml文件,返回Document对象
4. 其它操作(修改,添加,删除等操作)
5. (下面的步骤是需要回写文件时才有的)创建TransformerFactory工厂
6. 创建Transformer
7. 回写tf.transform(new DOMSource(), new StreamResult(“”));

一、新建一个person.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
    <per>
        <age>22</age>
        <sex>man</sex>
    </per>
    <per>
        <age>22</age>
        <sex>nv</sex>
    </per>
</person>

二、写java代码

一、首先封装一个方法,返回一个Document对象,方便调用

public static Document getDocument() throws Exception{
        //创建解析器工厂
        DocumentBuilderFactory docBulFac = DocumentBuilderFactory.newInstance();
        //创建解析器
        DocumentBuilder docBul = docBulFac.newDocumentBuilder();
        //解析xml文件,返回Document对象
        Document doc = docBul.parse("src/dom/person.xml");

        return doc;
    }

二、遍历节点

因为xml文件中节点有多层,所以这里要用到递归的方法遍历所有节点

public static void listNode() throws Exception{
        //获取document对象
        Document doc = getDocument();
        //调用函数
        list(doc);
}


public static void list(Node node) {
        //这里判断节点的类型,如果是Element元素,则输出节点的名称
        if(node.getNodeType() == Node.ELEMENT_NODE) {
            System.out.println(node.getNodeName());
        }
        //获取这一层的节点列表
        NodeList nl = node.getChildNodes();
        //循环遍历节点
        for(int i=0;i<nl.getLength();i++)
        {
            //得到第i个节点
            Node node1 = nl.item(i);
            //再次调用这个函数,执行相同的操作
            list(node1);
        }
        //输出结束标签
        if(node.getNodeType() == Node.ELEMENT_NODE) {
            System.out.println(node.getNodeName());
        }
}

三、查看某个节点

比如现在要查看第一个per里的第一个name的值

public static void selectOne() {
        try {
            Document doc = getDocument();
            NodeList nl = doc.getElementsByTagName("name");
            Node node = nl.item(0);
            System.out.println(node.getNodeName()+":"+node.getTextContent());
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

四、查看所有节点

public static void selectAll() {
        try {
            Document doc = getDocument();
            NodeList nl = doc.getElementsByTagName("name");
            for(int i=0;i<nl.getLength();i++)
            {
                Node node = nl.item(i);
                System.out.println(node.getNodeName()+":"+node.getTextContent());
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}

五、删除节点

这里要注意两点:
1. 删除节点修改的只是加载到内存中的document对象,并没有修改xml文件,所以在执行完操作后要执行回写的操作
2. 删除节点时必须通过节点的父节点删除,不能自己删除自己

public static void deleteNode() throws Exception{
        Document doc = getDocument();
        NodeList nl = doc.getElementsByTagName("name");
        Node n = nl.item(0);
        //得到其父节点
        Node np = n.getParentNode();
        //删除节点
        np.removeChild(n);
        //回写操作
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        tf.transform(new DOMSource(doc), new StreamResult("src/dom/person.xml"));
}

六、添加节点

添加节点需要注意:
1. 首先要创建节点和节点内的值
2. 必须执行回写操作

public static void addNode() throws Exception{
        Document doc = getDocument();

        NodeList nl = doc.getElementsByTagName("per");
        Node n = nl.item(0);
        //创建节点
        Element add = doc.createElement("add");
        //创建节点内的文本
        Text t = doc.createTextNode("123");
        //将文本添加到创建的节点里
        add.appendChild(t);
        //将新节点添加到其父节点里
        n.appendChild(add);
        //回写操作
        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        tf.transform(new DOMSource(doc), new StreamResult("src/dom/person.xml"));
}

七、修改节点

注意事项和上面两步一样

public static void alterNode() throws Exception{
        Document doc = getDocument();

        NodeList nl = doc.getElementsByTagName("name");
        Node n = nl.item(0);
        n.setTextContent("new text");

        TransformerFactory tff = TransformerFactory.newInstance();
        Transformer tf = tff.newTransformer();
        tf.transform(new DOMSource(doc), new StreamResult("src/dom/person.xml"));
}

你可能感兴趣的:(xml)