使用jaxp对XML文件进行dom解析

来源:互联网 发布:java concurrent书籍 编辑:程序博客网 时间:2024/06/05 09:15

简述

使用jaxp对XML文件进行dom解析,实现增删查改和遍历,代码如下,每一行代码都有注释。
思路:和jsp的dom解析几乎一样,方法名都很像。这里先得到document对象,然后利用document的一些方法去实现想要的操作。Node接口是Element接口和Text接口的父接口。

xml文件

对应的xml文件如下(person.xml):

<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>    <P1>        <name>AAA</name>        <age>12</age>    </P1>    <P1>        <name>BBB</name>        <age>123</age>    </P1></person>

代码

package xxy.test.jaxp;import java.io.IOException;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.w3c.dom.Text;import org.xml.sax.SAXException;/** * @author 许湘扬 2017-2-21 * @jaxp解析dom操作 * @注:增删操作,最后要回写,将在内存中的dom对象写入文件 */public class TestJaxp {    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException, TransformerException    {        //selectAll();        //selectFirst();        //addSex();        //modifyNodeText();        //delSex();        listElement();    }    /*     * 查询第一个name元素的值     */    public static void selectFirst() throws ParserConfigurationException, IOException, SAXException    {        //1、创建解析器工厂        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();        //2、用解析器工厂创建解析器        DocumentBuilder docuBuilder=builderFactory.newDocumentBuilder();        //3、解析xml,返回document        org.w3c.dom.Document document=docuBuilder.parse("src/person.xml");        //4、得到所有name元素        NodeList nodelist=document.getElementsByTagName("name");        //5、获得第一个name元素        Node name1=nodelist.item(0);        //6、得到name元素里的文本        String text=name1.getTextContent();        System.out.println(text);    }    /*     * 查询所有<name>节点     */    public static void selectAll() throws ParserConfigurationException,            SAXException, IOException     {        //1、创建解析器工厂        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();        //2、用解析器工厂创建解析器        DocumentBuilder docuBuilder=builderFactory.newDocumentBuilder();        //3、解析xml,返回document        org.w3c.dom.Document document=docuBuilder.parse("src/person.xml");        //4、得到所有name元素        NodeList nodelist=document.getElementsByTagName("name");        //5、遍历NodeList        for (int  i= 0;i  < nodelist.getLength(); i++)        {            //获得每一个name元素            Node name1=nodelist.item(i);            //得到name元素里的文本            String text=name1.getTextContent();            System.out.println(text);        }    }    /*     * 添加节点     * 这里:在第一个P1下面(末尾)添加 <sex>nv</sex>     */    public static void addSex() throws ParserConfigurationException, SAXException, IOException, TransformerException    {        //1、创建解析器工厂        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();        //2、用解析器工厂创建解析器        DocumentBuilder docuBuilder=builderFactory.newDocumentBuilder();        //3、解析xml,返回document        org.w3c.dom.Document document=docuBuilder.parse("src/person.xml");        //4、得到所有name元素        NodeList nodelist=document.getElementsByTagName("P1");        //获得第一个name元素        Node firstP1=nodelist.item(0);        //6、创建sex标签createElement(),创建文本标签         Text text1 =document.createTextNode("nv");        Element sex1=document.createElement("sex");        //7、把文本添加到sex下面 appendChild        sex1.appendChild(text1);        //8、把sex添加到第一个P1下面        firstP1.appendChild(sex1);        //9、回写xml  这一步骤保存好代码 以后直接复制使用,无需记忆        TransformerFactory transformerFactory=TransformerFactory.newInstance();        Transformer transformer=transformerFactory.newTransformer();        transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));    }    /*     * 修改节点     * 这里:以修改第一个sex为男,为例子     */    public static void modifyNodeText() throws ParserConfigurationException, SAXException, IOException, TransformerException    {        //1、创建解析器工厂        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();        //2、用解析器工厂创建解析器        DocumentBuilder docuBuilder=builderFactory.newDocumentBuilder();        //3、解析xml,返回document        org.w3c.dom.Document document=docuBuilder.parse("src/person.xml");        //4、得到所有sex元素        NodeList nodelist=document.getElementsByTagName("sex");        //5、获得第一个sex元素        Node sex=nodelist.item(0);        //6、修改sex的内容        sex.setTextContent("nan");        //7、回写xml        TransformerFactory transformerFactory=TransformerFactory.newInstance();        Transformer transformer=transformerFactory.newTransformer();        transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));    }    /*     * 删除节点     * 这里:删除<sex>nv</sex>     */    public static void delSex() throws ParserConfigurationException, SAXException, IOException, TransformerException    {        //1、创建解析器工厂        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();        //2、用解析器工厂创建解析器        DocumentBuilder docuBuilder=builderFactory.newDocumentBuilder();        //3、解析xml,返回document        org.w3c.dom.Document document=docuBuilder.parse("src/person.xml");        //4、得到所有sex元素        NodeList nodelist=document.getElementsByTagName("sex");        //5、获得第一个sex元素        Node sex=nodelist.item(0);        //6、获取sex的父节点        Node father=sex.getParentNode();        //7、使用removeChild方法删除节点        father.removeChild(sex);        //8、回写xml        TransformerFactory transformerFactory=TransformerFactory.newInstance();        Transformer transformer=transformerFactory.newTransformer();        transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));    }    /*     * 遍历所有节点,把所有元素名称打印出来     */    public static void listElement() throws SAXException, IOException, ParserConfigurationException    {        //1、创建解析器工厂        DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();        //2、用解析器工厂创建解析器        DocumentBuilder docuBuilder=builderFactory.newDocumentBuilder();        //3、解析xml,返回document        org.w3c.dom.Document document=docuBuilder.parse("src/person.xml");        //4、递归遍历每一个节点        list(document,0);    }    private static void list(Node node,int n)     {        if (node.getNodeType()==Node.ELEMENT_NODE)//只输出元素名        {            for(int i=0;i<n-1;i++)//输出层次空格                System.out.print(" ");            System.out.println(node.getNodeName());        }        NodeList nodeList=node.getChildNodes();        for(int i= 0;i<nodeList.getLength();i++)        {            list(nodeList.item(i),n+1);        }       }}
1 0