• xml解析技术


          本文总结Dom,sax解析,  使用Java作为工具解析xml文档。

          1 Dom

           综述:Dom解析xml通常也称为xmlDom (和htmlDom技术差不多),将xml文档封装成树,好处就是xml中的标签(属性)和Dom树

           中的节点一 一对应。节点都是对象,这样就可以使用对象的属性或者方法就操作xml。

           缺点:每一种技术都会有缺点,Dom解析的不足之处在于不是处理数据量大的xml文件,原因:Dom技术是直接将xml解析成树,装入到内存中,

           这样消耗的资源会比较多。

     

            以下面Myclass.xml为例

        

    <?xml version="1.0" encoding="utf-8"?>
    <class>
    	<stu id="sp001">
    		<name>小明</name>
    		<age>12</age>
    		<Math>100</Math>
    		<English>90</English>
    	</stu>
    	<stu id="sp002">
    	    <name>小李</name>
    		<age>12</age>
    		<Math>98</Math>
    		<English>90</English>
    	</stu>
    </class>
    

      

         (1)代码实现

          先解析xml 获取文档对象Document

        

     public  void GetDocument(url) {
    
    
          DocumentBuilderfactory   dbf=DocumentBuilderfactory.newInstance();//创建工厂
          DocumentBuilder bu=dbf.newDocumentBuilder();//Dom解析器
          Document document=bu.Parse(url) //解释文档返回文档对象,url为路径;
    
    
    } 
    

      

         *  接下来以添加一个节点:

         

    public addNode(Document doc){
    //创建节点
        Element stu=doc.CreateElement("stu");
       Element name=doc.CreateElement("name");
       Element age=doc.CreateElement("age");
    //添加属性和文本
        stu.setAttribute("id","sp003");//id属性
        name.setTextContent("小刘");
        age.setTextContent("11");
    //将节点添加stu中再到文档中
        stu.appendChild(name);
       stu.appendChild(age);
       doc.getDocumentElement.getChild(stu);//添加到xml文档中;
       
     //调用刷新函数(自定义),也是就三句话:工厂,对象,刷新;
     
      
    }
    

     注释:上面讲到了刷新函数,干什么的?

       我们将stu节点添加到文档中,注意不是直接到xml的,也是在内存中,只有刷新到xml文档中才会使得xml中可以看到新加的节点;

       所以要刷,具体怎么写,我真是忘记了! 这里记为 refresh();

       *  至于修改,删除那就差不多的。不介绍

      

       (2)居然Dom技术可以作用于xml和html,那有什么相似的地方?

        我是先学习htmlDom的,在html中我们通常使用属性去修改,设置值;比如

        document.getElementById('stu')..id="xxx";//添加id属性(说是设置也行);

        document.getElementById('name')..innerText="xxx";//添加文本;

        html中基本上使用属性,方法使用的不多,原因简单:属性操作不用考虑"浏览器兼容";

        对比xml中使用方法(基本上没有属性),解析xml文档也就没有什么“兼容不兼容”的事情!

        所以html会了,xml的解析也就差不多了。

     

       2  sax解析

              综述:

               sax技术可以用来处理xml比较大的情况,Dom技术是做不到的
               为什么Dom不能?sax可以?
               原因就是Dom技术是直接将xml解析成树,装入到内存中,这样消耗的资源会比较多。
               所以不适合处理数据较多时xml。sax技术不一样,他不用直接将xml装入到内存中,只是将需要的数据
               装进去。不会大量的消耗内存资源。sax技术适合处理遍历,读取。不适合(不能)用来修改数据。 

            原理 :

              sax技术主要是使用DefaultHander事件处理对象;

             比如里面有方法:

              &     public void startElement(String uri, String localName, String qName, Attributes attributes)  {//code}

             每一次访问<>都会调用一次;

            看参数:  qName是<>里的标签名,比如:<stu id="sp002">那么qName就是stu.。attributes数组,用来保存标签的属性。比如

          attributes.getValue("id"));就是"sp002"; 我们可以在code中处理,得到我们需要的!

              &     public void characters(char[] ch, int start, int length) {} //查看DefaultHander文档

                  

              (1)实现

              * 将xml文件和事件处理对象关联起来

     public SaxFunction(url){              
     SAXParserFactory factory=SAXParserFactory.newInstance();  
     SAXParser sax=factory.newSAXParser();
     sax.parse(url,new MyHander());  //将xml文件和事件处理对象关联起来,这个对象是自定义的!
    }
    

       *  重写事件对象DEfaultHander的方法

             

    class MyHander extends DefaultHandler{
       private  String name="";  // 关联属性;
    	@Override
    	public void characters(char[] ch, int start, int length) throws SAXException {
    	      String  con=new String(ch,start,length);
                  if(!con.trim().equals("")&&(this.name.equals(name) || this.name.equals("age")))
    	      System.out.println(con);
    	}
    
    	
    	@Override
    	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    		if(qName=="stu")
    	      {
    	    	  System.out.println(attributes.getValue("id"));
    	      }
    	  
    	}
    	  
      }
    

      

       注释:我们可以看到上面代码可拿到  属性"id",元素name,age的文本; 都是sax技术是不能添加,删除,修改数据的。这就是他的缺点。

       其他xml解析技术如:JDom,Dom4j。有时间在讨论!

       

         

     

  • 相关阅读:
    有问题的Py代码
    Python撑爆内存的代码
    python socket 绑定端口收发信息
    python socket UDP通信
    B类IP地址
    python in的用法
    Python continue的用法
    python27接受用户输入的数据
    基于jQuery实现左右图片轮播(原理通用)
    Jquery实现的简单轮播效果-代码
  • 原文地址:https://www.cnblogs.com/huang-1995/p/5860330.html
Copyright © 2020-2023  润新知