jaxp解析xml

xml的解析:

不同的公司和组织都提供了针对dom和sax方式的解析器,通过api方式提供

    sun公司提供了针对dom和sax解析器  jaxp
    dom4j组织,针对dom和sax解析器    dom4j(*** 实际开发中****)
    jdom组织,针对dom和sax解析器     jdom

1、首先讲jaxp对xml的解析
如何去查看该jaxp解析器?
jaxp解析器就在java.xml.parsers包里面
这里写图片描述
我们需要了解的方法

//dom
    DocumentBuilder类:解析器类
        这个类是一个抽象的类,不能直接实例化,不能new
        但是可以从DocumentBuilderFactory的newDocumentBuilder()获取
        //解析xml方法
        parse("xml")路径,返回值是:Document、
        -在document里面的方法:
            //这个方法可以得到标签,返回NodeList
            getElementByTagName(String TagName)
            //创建一个标签
            createElement(String tagName):
            //创建文本
            createTextNode(String data)
            //把文本添加到标签下面
            appendChild(Node newChild);
            //删除节点
            removeChild(Node oldChild);
            //获取父节点
            getParentNode();

        NodeList list
            //获取长度
            getLength();
            //下标取到具体的值
            item(int index);
            //得到标签的内容
            getTextContent();

    DocumentBuilderFactory:解析器工厂
        也是一个抽象类,不能实例化
        但是可以通过newInstance(),获取到实例化

2、演示所有的案例
假如说:有个person.xml在src文件夹下面

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<person>
    <p1>
        <name>zhangsan</name>
        <age>20</age>   
    </p1>
    <p1>
        <name>lisi</name>
        <age>30</age>
    </p1>
</person>

每次解析的三个步骤:这是固定的

         // 1、创建解析器工厂
         DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newIntance();
         // 2、根据解析器工厂创建解析器
         DocunmentBuilder builder = builderFactory.newDocumentBuilder();
         // 3、解析xml返回document
         Document document = builder.parse("src/person.xml");

查询:所有的name元素的值

//这里上面的前三步骤是必不可少的,这里忽略不写,直接从第四步骤
//得到name元素
        NodeList list = document.getElementsByTagName("name");
        //遍历集合
        for(int i=0;i<list.getLength();i++) {
            Node name1 = list.item(i); //得到每一个name元素
            //得到name元素里面的值
            String s = name1.getTextContent();
            System.out.println(s);
        }

查询:第一个的name元素的值

        //得到name元素
        NodeList list = document.getElementsByTagName("name");
        //使用下标 得到第一个元素
        Node name1 = list.item(1);
        //得到name里面的具体的值
        String s1 = name1.getTextContent();
        System.out.println(s1);

添加:在第一个p1下面添加< sex>nv< /sex>

//需求就是:在第一个p1下面添加< sex>nv< /sex>
//所以我们需要做的是:1)找到第一个p1,2)创建节点<sex>,3)添加文本,4)添加节点

//找到第一个p1
NodeList ps = document.getElementsByTagName("p1");
Node p1 = ps.item(1);

//创建节点
Element sex = document.createElement("sex");
//创建文本
Text text  = document.createTextNode("nv");
//添加文本
sex.appendChild(text);
//添加节点
p1.appendChild(sex1);
//回写xml,写法跟创建解析器步骤类似。下在下面

【为什么要进行回写?】
答:我们所有操作的xml都是在内存里面进行操作,他不会影响我们的xml文件,因此需要回写,把数据重新写到了xml中
【认识transformer:】
该类是一个抽象类,同样可以找到它的工厂解析器,所以它的实例化还是“三部曲”
这里写图片描述

//创建解析器工厂
TransformerFactory transformerFactory = TransformerFactory.newInstance();
//得到解析器
Transformer transformer = transformerFactory.newTransformer();
//回写操作,等到缓冲数据,写到新的文件
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml")); 

修改:第一个p1下面的sex内容是nan

//需求:第一个p1下面的sex内容。
//步骤:得到第一个p1下面的sex,修改内容

    //代码
    //得到sex
    Node sex1 = document.getElementsByTagName("sex").item(0);
    //修改sex值
    sex1.setTextContent("nan");
    //回写操作,省略

删除:nan节点

//需求:删除:<sex>nan</sex>节点。
//步骤:得到第一个p1下面的sex,然后删除

        //得到sex元素
        Node sex1 = document.getElementsByTagName("sex").item(0);
        //得到sex1父节点,这里需要注意的是,删除节点是利用父节点去删除哦,至于获取父节点的方法,也可以是document.getElementsByTagName("p1").item(0);
        Node p1 = sex1.getParentNode();
        //删除操作
        p1.removeChild(sex1);
        //回写操作,省略

遍历:所有的节点

//递归遍历的方法
    private static void list1(Node node) {
        //判断是元素类型时候才打印
        if(node.getNodeType() == Node.ELEMENT_NODE) {           
            System.out.println(node.getNodeName());
        }

        //得到一层子节点
        NodeList list = node.getChildNodes();
        //遍历list
        for(int i=0;i<list.getLength();i++) {
            //得到每一个节点
            Node node1 = list.item(i);
            list1(node1);
        }
    }

到此已经完成了对xml的增删改查

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值