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

简述

使用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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值