zoukankan      html  css  js  c++  java
  • dom jaxp详解

    转自 http://blog.csdn.net/java958199586/article/details/7277904

    一、XML解析技术概述

     1.XML解析方式分为两种:dom和sax

      (1)dom:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种方式。

      (2) sax:(Simple API for XML) 不是官方标准,但它是 XML 社区事实上的标准,几乎所有的 XML 解析器都支持它。

     2. XML解析器

        Crimson、Xerces 、Aelfred2

        XML解析开发包

    Jaxp、Jdom、dom4j

       (1)JAXP

            JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包 及其子包组成

    在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

       (2)使用JAXP进行DOM解析

    javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

       (3)获得JAXP中的DOM解析器

    调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

    调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

    调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

       (4)DOM编程

    DOM模型(document object model)

    DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

    在dom中,节点之间关系如下:

    位于一个节点之上的节点是该节点的父节点(parent)

    一个节点之下的节点是该节点的子节点(children)

    同一层次,具有相同父节点的节点是兄弟节点(sibling)

    一个节点的下一个层次的节点集合是节点后代(descendant)

    父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

    节点类型(下页ppt)

       (5)Node对象

    Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

    Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了

    二、DOM方式解析XML文件

       1.更新XML文档

           javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象 转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用   这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

    Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。 我们可以通过:

    javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

    用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

    Transformer对象通过TransformerFactory获得。

      2.实例

    (1)

    public class Demo02 {

        public static void main(String[] args) throws                           ParserConfigurationException, SAXException, IOException {

            //获取dom解析的工厂

            DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();

            //是否删除空格  false true

            factory.setIgnoringElementContentWhitespace(true);

            //获取解析器

            DocumentBuilder builder = factory.newDocumentBuilder();

            //把xml文档输入到解析器中,并获取xml文档对应的document对象

            //Document document = builder.parse(new                                 //File("D:\workspace\20110309\src\book.xml"));

            //Document document = builder.parse(new File("src\book.xml"));

            Document document = builder.parse(new                                   File("src\cn\csdn\dom\book.xml"));

            System.out.println(document.getDocumentURI());

            findNode(document);

        }

        //查询book元素中name元素第一个值

        private static void findNode(Document document) {

            NodeList nodeList = document.getElementsByTagName("name");

            System.out.println(nodeList.getLength());

            Node node = nodeList.item(0);  

            System.out.println(node.getTextContent());

        }

    }

    (2)

    public class Demo03 {

        public void ready() {

        }

        // 遍历所有的xml文档中的内容

        @Test

        public void test1() throws Exception {

            // 第一步:获取DocumentBuilderFactory工厂

            DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();

            // 设置去掉空格的方法

            factory.setIgnoringElementContentWhitespace(true);

            // 获取解析器

            DocumentBuilder builder = factory.newDocumentBuilder();

            // 解析xml文档

            Document document = builder.parse(new File("src\dom.xml"));

            //获取根节点对象

            Element root = document.getDocumentElement();

            /*//获取根节点元素名称

            String tagname = root.getTagName();

            System.out.println("根节点的名称是:"+root.getTagName());*/

            //调用Node中的getChildNodes()获取根节点的子节点

            NodeList Nlist = root.getChildNodes();

            //遍历该子节点

            display(Nlist);

        }

        //使用递归遍历个子节点中的子节点

        public void display(NodeList Nlist){

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

                Node node = Nlist.item(i);

                System.out.println(node.getNodeName());

                if(node.hasChildNodes()){//判断该节点是否还有子节点

                    NodeList list = node.getChildNodes();

                    display(list);  //调用方法本身

                }else{

                    if(node.getNodeType()==Node.TEXT_NODE){ //判断节点类型

                    System.out.println("         "+node.getTextContent());

                    }      

                    //当没有子节点时跳出

                    break;

                }

            }

        }

    }

         (3)

    public class Demo04 {

        @Test

        /**解析商丘的人口这个这个属性*/

        public void test1()throws Exception{

            DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();      

            DocumentBuilder builder  = factory.newDocumentBuilder();

            Document document = builder.parse(new File("src\dom.xml"));

            NodeList list = document.getElementsByTagName("商丘");     

            Node node = list.item(0);

            if(node.getNodeType()== Node.ELEMENT_NODE){

                Element element = (Element)node;

                String value = element.getAttribute("人口");

               System.out.println("属性的值是:"+value);

            }      

        }  

        @Test

        public void test2()throws Exception{

    DocumentBuilderFactory factory =    DocumentBuilderFactory.newInstance();      

            DocumentBuilder builder  = factory.newDocumentBuilder();   

            Document document = builder.parse(new File("src\dom.xml"));

            Element element =  document.getElementById("attr");    

            String value = element.getAttribute("id");

            String value1 = element.getAttribute("人口");

               System.out.println("属性的值是:"+value+"   "+value1);

        }

    }

    (4)

    public class Demo05 {  

        @Test

        public void test2()throws Exception{

            DocumentBuilderFactory factory =                                        DocumentBuilderFactory.newInstance();

    //      factory.setIgnoringElementContentWhitespace(true);

            DocumentBuilder builder  = factory.newDocumentBuilder();

            Document doc = builder.newDocument();      

            doc.setXmlVersion("1.0");      

            Comment comment = doc.createComment("创建xml文件");       

            doc.appendChild(comment);      

            Element root = doc.createElement("学生");      

            Element name = doc.createElement("姓名");

            name.appendChild(doc.createTextNode("rrrr"));

            Element sex = doc.createElement("性别");       

            sex.setAttribute("name", "男");    

            root.appendChild(name);

            root.appendChild(sex);

           

            doc.appendChild(root);     

            TransformerFactory factory1 = TransformerFactory.newInstance();

            Transformer tformer = factory1.newTransformer();

            tformer.transform(new DOMSource(doc), new                               StreamResult("src\ds.xml"));      

        }

    }

      (5)

    public class Demo06 {

        @Test

        public void test()throws Exception{

                DocumentBuilderFactory factory =                                            DocumentBuilderFactory.newInstance();

    //          factory.setIgnoringElementContentWhitespace(true);

                DocumentBuilder builder  = factory.newDocumentBuilder();

                Document doc = builder.parse(new File("src\dom.xml"));

                Element element = doc.createElement("东北旺"); 

                element.appendChild(doc.createTextNode("家"));

                Node node = doc.getElementsByTagName("海淀").item(0);

                node.appendChild(element);

                TransformerFactory factory1 = TransformerFactory.newInstance();

                Transformer tformer = factory1.newTransformer();

                tformer.transform(new DOMSource(doc), new                                   StreamResult("src\dom.xml"));

        }

        @Test

        public void test1()throws Exception{

            DocumentBuilderFactory factory =                                            DocumentBuilderFactory.newInstance();

    //          factory.setIgnoringElementContentWhitespace(true);

            DocumentBuilder builder  = factory.newDocumentBuilder();

            Document doc = builder.parse(new File("src\dom.xml"));

            Node node = doc.getElementsByTagName("海淀").item(0);

            node.removeChild(doc.getElementsByTagName("东北旺").item(2));

            TransformerFactory factory1 = TransformerFactory.newInstance();

            Transformer tformer = factory1.newTransformer();

            tformer.transform(new DOMSource(doc), new                                   StreamResult("src\dom.xml"));

        }

        @Test

        public void test2()throws Exception{

            DocumentBuilderFactory factory =                                            DocumentBuilderFactory.newInstance();

    //          factory.setIgnoringElementContentWhitespace(true);

            DocumentBuilder builder  = factory.newDocumentBuilder();

            Document doc = builder.parse(new File("src\dom.xml"));

            Node node1 = doc.getElementsByTagName("东北旺").item(0);

            node1.setTextContent("杀人");      

            TransformerFactory factory1 = TransformerFactory.newInstance();

            Transformer tformer = factory1.newTransformer();

            tformer.transform(new DOMSource(doc), new                                   StreamResult("src\dom.xml"));

        }

    }

    (6)book.xml

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE books[

       <!ELEMENT books (book*)>

       <!ELEMENT book (name,author,price)>

       <!ELEMENT name (#PCDATA)>

       <!ELEMENT author (#PCDATA)>

       <!ELEMENT price (#PCDATA)> 

       <!ATTLIST name length CDATA #IMPLIED> 

    ]>

    <books>

      <book>

         <name length="123">XML介绍</name>

         <author>rrrr</author>

         <price>100000</price>

      </book>

       <book>

         <name>XML介绍1</name>

         <author>rrrrr</author>

         <price>100000</price>

      </book>

    </books>

    更多 0

  • 相关阅读:
    js动态创建table表格的四种方法和性能测试(转载)
    render用法汇总(转载)
    echarts 解决 X轴与Y轴数据不对应问题;X轴日期显示顺序错误问题
    数组对象按时间字符串排序(转载)
    SQL Server 取日期时间部分(转载)
    iview Table行编辑、单元格编辑(转载)
    使用C#创建Windows服务
    马士兵-synchronized
    小程序登录笔记
    Prometheus+Grafana 的方法监控 Springboot 应用
  • 原文地址:https://www.cnblogs.com/samj114/p/3481218.html
Copyright © 2011-2022 走看看