|
XML解析器是XML和应用程序之间的一个软件组织,其目的是为应用程序从XML文件中解析出所需要的数据。有两种类型的解析器:基于DOM的解析器和基于事件的解析器。
浏览器的XML解析器只检查XML文件是否规范。当用浏览器打开一个有效的XML文件时,浏览器的XML解析器仅仅检查XML文件所关联的DTD文件是否有语法错误,并不检查XML文件是否遵守该DTD规定的约束条件。使用DOM解析器来检查一个XML文件是否有效。
DOM解析器的核心是在内存中建立和XML文件相对应的树形结构数据,XML文件的标记、标记的文本内容、实体等都会和内存中树状结构之数据的某个节点相对应。使用DOM解析器的好处是:一个应用程序可以方便地操作内存中树的节点来处理XML文档,获取自己所需的数据。 Example: 1、使用javax.xml.parsers包中的DocumentBuilderFactory类调用其类方法newInstance()实例化一个DocumentBuilderFactory对象: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 2、factory 对象调用newDocumentBuilder()方法返回一个DocumentBuilder对象(称做DOM解析器): DocumentBuilder builder = factory.newDocumentBuilder(); DocumentBuilder类在javax.xml.parsers包中。 3、builder 对象调用public Document parse(File f)方法解析参数f指定的文件,并将解析内容以对象的形式返回,该对象是实现了Document接口的一个实例,例如: Document document = builder.parse(new File("price.xml")); Document接口在org.w3c.dom包中。 注意:如果想要DocumentBuilderFactory产生的DOM解析器支持名称空间,可以让factory 对象调用 setNamespaceAware(boolean b)方法: factory .setNamespaceAware(true); 4、对象Document是由实现了Node接口的类的实例构成的,这些实例称做Document对象中的节点。Document调用NodeList getElementsByTagName(String str)方法,返回一个实现了NodeList接口的对象,该对象也是由一些Node对象组成的,例如: NodeList nodelist = document.getElementsByTagName("车次"); NodeList接口在org.w3c.dom包中。假如XML文件中有两个名称为“车次”标记,那么nodelist.getLength(); 返回的值是2,即nodelist刚好含有2个Node对象。 DOM解析器经常使用下述3个方法解析XML文件: public Document parse(File f) throws SAXException,IOException public Document parse(InputStream in) throws SAXException,IOException public Doucment parse(String uri) throws SAXException,IOException 方法parse(File f)可以解析参数f指定的XML文件,例如: File f = new File("price.xml"); Document document = builder.parse(f); 方法parse(InputStream in)可以解析输入流参数in指向的XML文件,例如: FileInputStream in = new FileInputStream("price.xml"); Document document = builder.parse(in); 方法parse(String uri)可以解析参数uri指定的一个有效的资源,如果uri是一个连接地址,该连接地址必须是可以访问的,例如: String uri = "http://192.168.0.200/price.xml" Document document = builder.parse(uri);
SAX解析器的核心是事件处理机制,和DOM解析器相比,SAX解析器占有的内存少,对于许多应用程序,使用SAX解析器来获取XML数据具有较高的效率。 Example: 1、使用javax.xml.parsers包中的SAXParserFactory类调用其类方法newInstance()实例化一个SAXParserFactory对象: SAXParserFactory factory = SAXParserFactory.newInstance(); 2、factory 对象调用newSAXParser()方法返回一个SAXParser对象(称做SAX解析器): SAXParser saxParser = factory.newSAXParser(); SAXParser类在javax.xml.parsers包中。 注意:如果想要SAXParserFactory产生的SAX解析器支持名称空间,可以让factory 对象调用 setNamespaceAware(boolean b)方法: factory .setNamespaceAware(true); 3、SAX解析器使用下述parse()方法解析XML文件: Public void parse(File f,DefaultHandler dh) throws SAXException,IOExcepyion Public void parse(InputStream is,DefaultHandler dh) throws SAXException,IOException Public void parse(String uri,DefaultHandler dh) throws SAXException,IOException Public void parse(String uri) throws IOException,SAXException 上述parse方法的参数dh是DefaultHandler类型,解析器调用parse方法时,必须向dh传递一个DefaultHandler类或子类的对象,DefaultHandler是org.xml.sax.helpers包中的类,该类或其子类的对象称作解析器的事件处理器。 事件处理器调用的方法: 文件开始 startDocument() 开始标记 startElement(String uri,String localName,String qName,Attributes atts) 参数atts是解析器发现的标记的全部属性,参数uri是解析器发现的标记的名称空间,localName是标记的名称,qName是带名称空间前缀的标记名称或标记的名称(依赖于该标记是否有名称空间)。如果标记没有名称空间,uri值为null。 文本 Characters(char[] ch,int start,int length) 结束标记 endElement(String uri,String localName,String qName) 文件结束 endDocument()
|