`
cowpoke
  • 浏览: 20281 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

(转)使用Apache Xerces解析XML文档

阅读更多
一、技术概述
 
在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组织实现的好。
 
Java解析XML的原理图如下:
 
目前Java XML解析器有十多种之多,解析原理有二:使用基于事件的XML简单API(Simple API for XML)称为SAX和基于树和节点的文档对象模型(Document Object Module)称为DOM。Sun公司提供了Java API for XML Parsing(JAXP)接口来使用SAX和DOM,通过JAXP,我们可以使用任何与JAXP兼容的XML解析器。但并不是所有的Java XML解析工具都实现了SUN提供的接口。DOM4J就没有遵循SUN的JAXP规范,但非常优秀。
 
DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。
 
DOM 是W3C组织推荐的处理XML的标准接口,DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。
 
SAX是由XML_DEV邮件列表的成员开发的,它不是某个官方机构的标准,也不由W3C组织或其他任何官方机构维护,但它是XML社区事实上的标准。虽然SAX只是“民间”标准,但是它在XML中的应用丝毫不比DOM少,几乎所有的XML解析器都支持它。SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。
 
DOM和SAX只是定义了一些接口,以及某些接口的默认实现,一个应用程序要想利用DOM或SAX访问XML文档,还需要一个实现了DOM或SAX的解析器(实现DOM和SAX中定义的接口,提供DOM和SAX定义的功能)。
 
Apache的Xerces是一个使用非常广泛的解析其,它提供了DOM和SAX的调用接口,并有多种语言的实现版本,要利用Xerces访问XML文档,只需要在应用程序中构造一个解析器实现类的对象。
 
这里面还存在一个问题,虽然使用的是标准的DOM和SAX接口,由于不同的XML解析器的实现类是不同的,如果使用另外一种解析器,仍然需要修改应用程序,只不过修改的代码量较小,需要更改XML解析器实现类的类名,然后重新编译、发布。
 
然而,对于兼容JAXP的XML解析器,我们可以选用JAXP API,这样在更换兼容JAXP解析器的时候,就不用对已发布的程序做任何的改动。
 
JAXP开发包由javax.xml包、org.w3c.dom包、org.xml.sax包及其子包组成。在javax.xml.parsers包中,定义了几个工厂类,用于加载DOM和SAX的实现类。
 
 
使用JAXP API解析XML的原理如下:
 
二、使用DOM解析XML
 
DOM的核心概念就是NODE(节点)。DOM在分析XML文档时,将组成XML文档的各个部分(元素,属性,文本,注释,处理指令等)映射成一个对象,这个对象就叫做节点。在内存中这些节点形成一棵树。整棵树就是一个节点,树中的每一个节点也是一棵树(子树)。DOM就是对这棵树的一个对象描述,我们通过访问树中的节点来存取XML文档的内容。
 
DOM定义了一个Node接口,用于表示文档树中一个节点。从这个接口派生出来更多的具体的接口。例如,表示整个文档的Document接口,表示XML文档中的一个元素的Element接口,表示元素属性的Attr接口,都是从Node接口派生而来的。在org.w3c.dom包中,表示XML文档各组成部分的接口的继承关系如图:
 
 
举个例子,引用java web开发大全,有改动:
 
students.xml
----------------------------------------------------------------------
<!---->
<!---->

   
        张三
        18
   
   
        李四
        20
   
----------------------------------------------------------------------
 
public class DOMStudentsInfo {
    public static void main(String[] args) {
        //获取生成 DOM 对象树的解析器
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        try {
            //从 DocumentBuilderFactory获取 DocumentBuilder实例
            DocumentBuilder db = dbf.newDocumentBuilder();
            File file = new File(\"students.xml\");
            ////从 XML 文档获取 DOM 文档实例
            Document doc = db.parse(file);
            //获取某节点的集合
            NodeList nl = doc.getElementsByTagName(\"student\");
            int len = nl.getLength();
            for (int i = 0; i < len; i++) {
                Element eltStu = (Element) nl.item(i);
                Node eltName = eltStu.getElementsByTagName(\"name\").item(0);
                Node eltAge = eltStu.getElementsByTagName(\"age\").item(0);
                String name = eltName.getFirstChild().getNodeValue();
                String age = eltAge.getFirstChild().getNodeValue();
                System.out.print(\"姓名:\");
                System.out.println(name);
                System.out.print(\"年龄:\");
                System.out.println(age);
                System.out.println(\"----------------------------\\n\");
            }
        }
        catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        catch (SAXException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 
运行结果:
 

<!---->

   
        a1234
        四川省xx县xx镇xx路x段xx号
   
   
        b1234
        四川省xx市xx乡xx村xx组
   
----------------------------------------------------------------------
 
public class MyXMLReader2 extends DefaultHandler {
    java.util.Stack tags = new java.util.Stack();
    public MyXMLReader2() {
        super();
    }
    public static void main(String args[]) {
        long lasting = System.currentTimeMillis();
        try {
            SAXParserFactory sf = SAXParserFactory.newInstance();
            SAXParser sp = sf.newSAXParser();
            MyXMLReader2 reader = new MyXMLReader2();
            sp.parse(new InputSource(\"data_10k.xml\"), reader);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(\"运行时间:\" + (System.currentTimeMillis() - lasting) + \" 毫秒\");
    }
    public void characters(char ch[], int start, int length) throws SAXException {
        String tag = (String) tags.peek();
        if (tag.equals(\"no\")) {
            System.out.print(\"车牌号码:\" + new String(ch, start, length));
        }
        if (tag.equals(\"addr\")) {
            System.out.println(\" 地址:\" + new String(ch, start, length));
        }
    }
    public void startElement(
            String uri,
            String localName,
            String qName,
            Attributes attrs) {
        tags.push(qName);
    }
}
 
运行结果:
 
            SAXReader reader = new SAXReader();
            Document doc = reader.read(f);
            Element root = doc.getRootElement();
            Element foo;
            for (Iterator i = root.elementIterator(\"value\"); i.hasNext();) {
                foo = (Element) i.next();
                System.out.print(\"车牌号码:\" + foo.elementText(\"no\"));
                System.out.println(\" 车主地址:\" + foo.elementText(\"addr\"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(\"运行时间:\" + (System.currentTimeMillis() - lasting) + \" 毫秒\");
    }
}
 
五、使用JDOM解析xml
 
public class MyXMLReader3 {
    public static void main(String arge[]) {
        long lasting = System.currentTimeMillis();
        try {
            SAXBuilder builder = new SAXBuilder();
            Document doc = builder.build(new File(\"data_10k.xml\"));
            Element foo = doc.getRootElement();
            List allChildren = foo.getChildren();
            for (int i = 0; i < allChildren.size(); i++) {
                System.out.print(\"车牌号码:\" + ((Element) allChildren.get(i)).getChild(\"no\").getText());
                System.out.println(\" 车主地址:\" + ((Element) allChildren.get(i)).getChild(\"addr\").getText());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(\"运行时间:\" + (System.currentTimeMillis() - lasting) + \" 毫秒\");
    }
}
 
六、使用JAXP解析XML
 
public class MyXMLReader1 {
    public static void main(String arge[]) {
        long lasting = System.currentTimeMillis();
        try {
            File f = new File(\"data_10k.xml\");
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(f);
            NodeList nl = doc.getElementsByTagName(\"value\");
            for (int i = 0; i < nl.getLength(); i++) {
                System.out.print(\"车牌号码:\" + doc.getElementsByTagName(\"no\").item(i).getFirstChild().getNodeValue());
                System.out.println(\" 车主地址:\" + doc.getElementsByTagName(\"addr\").item(i).getFirstChild().getNodeValue());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(\"运行时间:\" + (System.currentTimeMillis() - lasting) + \" 毫秒\");
    }
}
  • 3.jpg (1.3 MB)
  • 下载次数: 45
  • 2.jpg (4.4 MB)
  • 下载次数: 22
  • 1.jpg (3 MB)
  • 下载次数: 37
分享到:
评论

相关推荐

    Apache Xerces解析器

    而Xerces解析器就是处理XML文档的核心组件,它能够读取XML文档,验证其语法合法性,并将XML数据转换为程序可以处理的形式。 Xerces解析器遵循W3C制定的XML规范,包括XML 1.0和XML 1.1,以及相关的命名空间、XML ...

    VIsual c++ 使用apache xerces操作XML

    2. **DOM解析方式**: 在Visual C++中,可以使用Xerces的DOM解析器来创建一个内存中的XML文档表示。首先,需要包含必要的头文件,如`xercesc/dom/DOM.hpp`,然后通过`DOMDocument`类加载XML文件,使用`createElement`...

    xerces解析xml

    本文将详细介绍Xerces-C++的安装过程以及如何使用它来解析XML文档。 **一、Xerces-C++简介** Xerces-C++是XML规范的C++实现,它提供了全面的DOM(文档对象模型)、SAX(简单API for XML)和XInclude处理。这个库...

    org.apache.xerces-2.9.0.jar/xerces.jar

    总结来说,Apache Xerces 2.9.0作为Java平台上的XML解析库,提供了多种API来处理XML文档,对于开发涉及XML处理的项目至关重要。正确地将"org.apache.xerces-2.9.0.jar"引入项目,可以避免因缺少解析器而导致的编译...

    xerces-c-src1_6_0.tar.gz_ xerces_XML解析_apache_xerces_xml parser

    而Xerces-C++则是Apache软件基金会开发的一款开源、跨平台的XML解析器,它为C++开发者提供了一套强大的工具来处理XML文档。本文将深入探讨Xerces-C++的特性、工作原理以及其在Apache项目中的应用。 首先,Xerces-...

    xerces-1.4.3 XML解析器

    Xerces解析器的主要功能就是解析XML文档,将其内容转换成程序可以理解和处理的数据结构。它支持XML 1.0和XML 1.1规范,同时包含了对DOM(Document Object Model)、SAX(Simple API for XML)和JAXP(Java API for ...

    Xerces解析文档Xerces解析文档

    9. **示例代码**:提供实际的编程示例,展示如何使用Xerces-C++解析XML文件,进行数据提取、验证等操作。 通过深入学习Xerces解析文档,开发者可以掌握XML数据处理的核心技术,为构建XML相关的应用程序提供坚实的...

    对Apache生产的XML文档生成和解析库的封装,支持XML中包含中文字符串

    2. 解析XML文档:加载XML文件,生成DOM树或触发SAX事件,支持编码识别和转换。 3. 操作XML节点:查找、修改、删除XML树中的节点,支持XPath表达式。 4. 错误处理:捕获并报告解析过程中的错误,如语法错误、编码错误...

    apache-xml-xerces.jar.zip

    1. **XML解析**:Xerces能够解析XML文档,验证其是否符合XML规范,包括命名空间、DTD(Document Type Definition)或XML Schema的验证。 2. **DOM(Document Object Model)**:Xerces-J支持DOM API,将XML文档解析...

    利用xerces对xml文件进行解析

    以下是如何使用JAXP和Xerces解析XML的示例: ```java import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; DocumentBuilderFactory factory = DocumentBuilderFactory....

    apache xerces-c-3.0.1

    1. **DOM解析**:Xerces-C++提供了完整的DOM实现,允许开发者以对象树的形式访问XML文档的结构。这使得可以轻松地遍历和修改XML文档。 2. **SAX解析**:对于处理大型XML文档,SAX解析器是一种高效的选择,因为它...

    apache xmlschema api文档

    - 验证XML文档:创建`Validator`对象,然后使用它来验证XML文档是否符合XML Schema。 - 动态解析XML Schema:根据需要加载和解析XML Schema文档,以适应不同的业务需求。 - 查询XML Schema信息:获取元素、属性、...

    Java SAX解析Xml文档Demo

    本示例将详细解释如何在Java中使用SAX解析XML文档,并通过注释进行详细说明。 首先,我们需要引入SAX解析器的依赖库,通常这可以通过在项目构建配置中添加JAXB或Xerces实现来实现。 ```java // 引入必要的库,如...

    xercesXML遍历xml

    Xerces-C++ 是一个开源的XML解析器,由Apache软件基金会开发,它提供了C++接口来处理XML文档。本项目"XercesXML遍历xml"提供了一个不依赖外部库的示例,帮助开发者了解如何利用Xerces-C++库遍历和解析XML文件。 ...

    Apache生产的XML文档生成和解析库,版本2.8,支持中文

    Xerces-C++是一个高性能、完全符合W3C标准的XML解析器,能够处理XML文档的解析、验证和序列化。Xalan-C++则是一个XSLT处理器,可以将XML文档转换为其他格式,如HTML或纯文本,通常与Xerces-C++配合使用,实现XML到...

    使用Digester解析XML文档示例

    ### 使用Digester解析XML文档示例 #### 一、Digester简介与应用场景 Digester是Apache Jakarta项目下的一个工具类库,它简化了基于SAX(Simple API for XML)的XML解析过程。Digester能够根据定义好的规则自动将...

    Java解析xml的包--xerces.jar 用于开发xml相关的内空的包..zip

    Xerces解析器提供了多种解析XML文档的方式,包括DOM(Document Object Model)、SAX(Simple API for XML)和JAXP(Java API for XML Processing)。这些API为开发者提供了灵活的选择,可以根据项目需求选择合适的...

    xerces.jar xml解析 生成必备工具包.zip

    例如,使用Xerces的DOM解析,可以创建`org.apache.xerces.parsers.DOMParser`对象,设置其解析属性,然后调用`parse`方法解析XML文件。对于SAX解析,可以创建`org.apache.xerces.parsers.SAXParser`,注册事件处理器...

    Xerces-xml-schema

    Xerces-XML-Schema 是一个由 Apache 软件基金会开发的开源项目,它提供了一套强大的 XML 解析器,支持 XML Schema 规范,使得开发者能够有效地处理符合 XML Schema 的文档。Xerces-J 是该项目针对 Java 语言的实现,...

Global site tag (gtag.js) - Google Analytics