前面我们提到了xml解析的技术有两种:dom 和 sax,解析器对于不同的公司和组织也有所不同,sun公司的jaxp,dom4j组织的dom4j,jdom组织的jdom,今天我们就来了解一下sun公司的jaxp解析器是如何解析xml的;

     *jaxp的api查看

            *jaxp是javase的一部分

            *jaxp解析器在jdk的javax.xml.parsers包里面

                    **四个类:分别是针对dom和sax技术解析使用的类

                    **dom

                            DocumentBuilder:解析器类

                                   -这个类是一个抽象类,不能new

                                   -这个类的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取

                                   -这个类具有一个方法可以解析xml,即parse(“xml路径”),返回的是Document整个文档

                                   -返回的Document是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找

                                   ***Document里面的常用方法:

                                             -getElementsByTagName(String tagname)

                                                  -这个方法可以得到标签,返回集合NodeList


                                             -createElement(String tagname)

                                                  -创建标签


                                             -createTextNode(String data)

                                                  -创建文本


                                             -appendChild(Node newChild)

                                                  -把文本或标签添加到标签下面 


                                             -removeChild(Node  oldChild)

                                                  -删除节点


                                             -getParentNode()

                                                  -获取父节点

                                             

                                             **NodeList集合(list)

                                                 - getLength()      得到集合的长度

                                                 - item(int index) 根据下标取到具体的值

                                                 for(int i=0;i<list.getLength( );i++){

                                                           list.item( i );

                                                  }

                            DocumentBuilderFactory:解析器工厂

                                   -这个类也是一个抽象类,不能new

                                   -通过本身的newInstance()获取DocumentBuilderFactory的实例

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persion>
    <p>
        <name>fangwenhui</name>
        <age>20</age>
        <sex>boy</sex>
    </p>
    <p>
        <name>fangwenbin</name>
        <age>23</age>
        <sex>boy</sex>
    </p>
</persion>

                            **使用jaxp实现查询操作

                                 **查询xml中所有name元素的值

                                    /*
                                     * 1、创建解析器工厂

                                              DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance( );

                                     * 2、根据解析器工厂创建解析器

                                              DocumentBuilder builder=builderFactory.newDocumentBuilder( );

                                     * 3、解析xml得到document对象

                                              Document document=builder.parse("src/persion.xml");

                                     * 4、得到所有的name元素

                                              使用document.getElementsByTagName("name");

                                     * 5、返回集合,遍历集合,得到所有的name元素

                                              - 遍历 getLength()  item()

                                              - 得到元素里面的值  使用 getTextContent()           

                                    */

                                 **查询xml中第一个name元素的值

                                    /*
                                     * 1、创建解析器工厂

                                     * 2、根据解析器工厂创建解析器

                                     * 3、解析xml得到document对象

                                     * 4、得到所有的name元素

                                     * 5、返回集合,使用集合里的方法item(),根据下标获取具体的元素

                                              -NodeList.item(下标):集合下标从0开始

                                     * 6、得到具体的值  使用 getTextContent()方法           

                                    */

                            **使用jaxp实现添加节点操作

                                 **在第一个p标签下(末尾)添加<height>172</height>

                                     /*
                                      * 1、创建解析器工厂
                                      * 2、根据解析器工厂创建解析器
                                      * 3、解析xml文件得到document对象
                                      * 4、得到第一个p标签
                                      * 5、创建属性标签       createElement
                                      * 6、创建文字内容节点       createTextNode
                                      * 7、将文字内容节点添加到标签下     appendChild
                                      * 8、将标签添加到第一个p标签下     appendChild
                                      * 9、回写xml

                                                TransformerFactory transformerFactory=TransformerFactory.newInstance();
                                                Transformer transformer=transformerFactory.newTransformer();
                                                transformer.transform(new DOMSource(document),new StreamResult("src/persion.xml"));

                                      */

                            **使用jaxp实现删除节点操作

                                 **删除<height>172</height>节点

                                     /*
                                      * 1、创建解析器工厂
                                      * 2、根据解析器工厂创建解析器
                                      * 3、解析xml文件得到document对象
                                      * 4、获取height元素
                                      * 5、获取height的父节点,使用getParentNode()方法                                   

                                      * 6、删除使用其父节点删除,使用removeChild()方法
                                      * 7、回写xml

                                      */

                            **使用jaxp实现遍历节点操作

                                 **递归遍历的方法

                                     /*
                                      * 1、创建解析器工厂
                                      * 2、根据解析器工厂创建解析器
                                      * 3、解析xml文件得到document对象
                                      * 4、调用方法:list1(document)

                                      */

    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 child=list.item(i);
            //递归调用
            list1(child);
        }
    }

                    **sax

                            SAXParser:解析器类

                            SAXParserFactory:解析器工厂