XML的java解析- -

来源:互联网 发布:淘宝9.9限时抢购在哪里 编辑:程序博客网 时间:2024/04/30 07:28

* SAX API是基于事件的。实现了SAX APIXML解析器跟据解析到的XML文档的不同特征产生事件。通过在Java代码中捕捉这些事件,就可以写出由XML数据驱动的程序。

    解析过程中需要XML解析器,Apache Xerces就是其中的一种,可以从http://xml.apache.org/dist/xerces-j/下载需要的解析器代码,解压缩程序后,将生成的xercesSamples.jar, xercesImpl.jar, xml-apis.jar,xmlParserAPIs.jar加入到系统的classpath中(或者xerces.jar,在1.4.4版本中,该jar文件相当于上述jar的集合)。

   并且指定解析程序需要的编译器,有两种方式指定:

1)在主程序中,进行解析前,即 XMLReader xr = XMLReaderFactory.createXMLReader(); 添加如下代码:

System.setProperty("org.xml.sax.driver","org.apache.xerces.parsers.SAXParser");

2)使用下面的命令,进行编译执行:

java -Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser Example2,Example2为主程序名称;

  使用SAX API的主要任务就是创建一个实现ContentHandler接口,一个供XML 解析器调用以将分析XML文档时所发生的SAX事件分发给处理程序的回调接口。SAX API也提供了一个已经实现了ContentHandler接口的DefaultHandler适配器类。

  在DefaultHandler中,提供了如下的方法进行重载:

    startDocument, endDocument, startElement, endElement, characters,这几种方法;

   对于如下的xml文档:

   <?xml version="1.0"?>
        <simple date="7/7/2000" >
        <name> Bob </name>
        <location> New York </location>
   </simple>

   进行解析的顺序如下:

     Example1 SAX Events:
    SAX Event: START DOCUMENT
    SAX Event: START ELEMENT[ simple ]
   ATTRIBUTE: date VALUE: 7/7/2000
   SAX Event: CHARACTERS[  ]
SAX Event: START ELEMENT[ name ]
SAX Event: CHARACTERS[  Bob  ]
SAX Event: END ELEMENT[ name ]
SAX Event: CHARACTERS[   ]
SAX Event: START ELEMENT[ location ]
SAX Event: CHARACTERS[  New York  ]
SAX Event: END ELEMENT[ location ]
SAX Event: CHARACTERS[  ]
SAX Event: END ELEMENT[ simple ]
SAX Event: END DOCUMENT

即在解析的过程中,会调用我们extends DefaultHandler的方法,例如解析开始,先动用startDocument方法,然后遇到<simple>后,调用startElement等。在调用的过程中,将中间解析到的结果存放在中间变量中:

  例如: 

public void startElement( String namespaceURI,  String localName, String name,    Attributes attr ) throws SAXException {

     System.out.println( "SAX Event: START ELEMENT[ " +
      localName + " ]" );  

   //Also, let's print the attributes if
  // there are any...
                for ( int i = 0; i < attr.getLength(); i++ ){
                   System.out.println( "   ATTRIBUTE: " +
                   attr.getLocalName(i) +  " VALUE: " +   attr.getValue(i) );
      }
 

解析程序,将中间结果存放在namespaceURL,localName,name,以及Attributes attr中,用户扩展的程序中,可以将这些结果读取出来,判断是否是自己需要的,如果是那么进行处理。

   因此SAX,是数据驱动的。

这是SAX的最基本的原来,还有些问题需要处理:例如,在xml中,不同位置的element元素名称相同,在SAX API中,如何处理呢,可以使用Stack将不同元素的路径保存在堆栈中,使用元素的路径名来判别不同位置的元素。或者其他的问题;

原创粉丝点击