SAX DOM解析xml文件的异同

Posted on 2009-06-07 01:22 飘摇 阅读(1276) 评论(0)  编辑  收藏 所属分类: Java 核心技术
  xml作为存贮数据的高效率载体,解析xml文件也是一件很重要的技能,尤其是在大量数据处理的程序中,下面就两种解析技术进行比较。
   -----------------------------------------------------------------------------------------------------------
先来看看xml文件,xml文件是按严格的格式来书写的。他的元素都是成对出现的,不允许元素交叉出现,属性可以写在标签内,解析他的时候要用到解析器,解析器是一个程序,它读入一个文件,确认它有正确的格式,然后把它分解成各个元素,是我们可以使用这些元素,
<font>
   <name>Helvetica</name>
  <size> 36</size>
</font>
 1.--------------------DOM解析 文档对象模型,也称为树形解析,将读入的文件转换为树结构,适合数据量不大的解析。
    要读入一个文档,首先要一个DocumentBuilder对象,你可以从DocumentBuilderFactory工厂中得到。
      DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//调用静态方法产生,单例用法
      DocumentBuilder            builder = factory.newDocumentBuilder();
  现在可以从文件中读入文档了。。。。。
  File    f = "xx.xml";
  Document doc = builder.parse(f);
或是用一个url
   URL u = ......
  Document doc = builder.parse(u);
还可以是任意的输入流
 InputStream in = .......
 Document doc = builder.parse(in);

Document 对象是xml文档的树形结构在内存中的表现。它有实现Node接口以及其它子接口的类对象构成
 可以调用getDocumentElement方法来分析文档内容,它将返回跟元素
  Element root = doc.getDocumentElement();
   root.getTagName()返回字符串"font";getChildNodes()得到该元素的子元素(可以是子元素,文本,注释或其他节点),它将返回一个NodeList集合
   你可以这样枚举多有元素
   NodeList  children  =  root.getChildNodes();
     for(int i= 0 ;i<children.getLength();i++)
    {
           Node child = children.item(i);
           .......
    }
  分析元素要仔细了,假如你正在处理上面的xml文档,可能你希望得到font的两个元素。但是解析却告诉你有5个;
  <font>和 <name>之间的空白字符
 name元素
 </name> 和<size>之间的空白字符
  size元素
 </size> 和</font>之间的空白字符
 如果你希望得到子元素,可以忽略空白字符
 for(int i=0;i<children.getLength();i++){
     Node child= children.item(i);
   if(child instanceof Element){
                Element childElement = (Element)child;
   }
}//当然你也可以定义DTD文档这样解析是可以自动去掉空白字符。

2.---------------------SAX解析 流解析机制 以事件触发型解析,处理数据量大的文件,
  SAX解析器是在解析XML输入的构件时就报告事件,但不会以任何方式存储文档,有事件处理器决定是否要建立数据结构,实际上,DOM解析器是在SAX解析器基础上建立起来的,
  sax解析时,需要一个处理器来解析,要实现ContentHandler 接口,他定义了很多回调方法。
   如 startElement endElement 在每当遇到起始或结束时各调用一次。
      characters每当遇到字符时调用,
      startDocument endDocument分别在文档开始和结束时各调用一次。
   下面我们举个例子,打印文件中所有的链接<a href=""> 它只覆盖了处理器得到startElement方法,用来检测a 属性为href 的链接,他的潜在用途就是网络爬虫 ,即沿着一个链接到达越来越多的网页程序。
   SAXParseFactory factory = SAXParseFactory.newIntace();
  SAXPares              parse = factory.newSAXParse();

 parse.parse(source,handler)//source是要处理的文件, handler 处理器的一个子类defaultHandler 他实现了四个接口。
    DefaultHandler hander = new DefaultHandler(){
                public void startElement(String namespaceURI,String lname, String qname,Attribute attrs) throws SAXException
            //qname 报告限定名。
         {
             if(lname.equalsIgnorCase("a")&& attrs!=null){
               for(int i=0 ; i<attrs.getLength();i++){
                     String name = attrs.getLocalName(i);
                      if(name.equealIgnoreCase("href"))
                           System.out.println(attrs.getValue(i));
                    }
                }
          }


----------------------------------另外还有一种StAX解析器,是一种拉解析(pull parse),与安装事件处理器不同,你只需要使用下面的基本循环俩迭代所有事件。
       InputStream in = url.openStream();
      XMLInputFactory factory = XMLInputFactory.newInstance();
      XMLStreamReader parse = factory.createXMLStreamReader(in);
 while(parse.hasNext(0){
          in event = parser.next();
}
------------------------------------------------还在学习中,希望上面的可以对大家有些帮助。
};

只有注册用户登录后才能发表评论。


网站导航:
 

posts - 15, comments - 3, trackbacks - 0, articles - 2

Copyright © 飘摇