JAXP(Java API for XML Parsing) 

 

过去几年中,XML分折已经被标准为两个不同的处理模型:SAX(Simple API for XML)以及DOM(Document Object Model)。

 

这 两个标准提供了各种API以便开发人员处理XML数据,分别适用于不同的分折需要。JAXP是SUN公司在1999年后期提出的,它是一个API,但更准 确地说,它应该是一个抽象层。JAXP并不提供解折功能!没有SAX、DOM或其它XML解折API,我们无法解折XML。 
一、SAX(Simple API for XML)
SAX是基于事件的处理模型,在此模型中,解折程序按序列顺序解释数据元素,同时基于所选择的结构回调函数。它最大的优点是:它并不把任何XML文档装载进内存,因此被认为是非常迅速和轻便的。它使用一个序列只读的方法,并不支持对XML元素的随机访问。 
基本实现由以下三个骤组成
1、实现一个扩展DefaultHandler的类,并为每种类型的结构包含回调方法。
2、初始化一个新的SAXParser类。Parser读到XML源文件,并触发DefaultHandler类中所实现的一个回调方法
3、须序读取XML源文件。在须序读取中,无法随机访问结构中的元素。剩下的工作取决于Handler类中你的实现方案。 
示例
书写一个用于读取的XML文檔test.xml,具体内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<simple date="21/2/2006">
        <name>wang</name>
        <location>China DongGuan</location>
</simple>
 
实现一个扩展DefaultHandler的类SaxTestHandler.java代码如下
package mypack;
 
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
public class SaxTestHandler extends DefaultHandler {
 
        // 重载DefaultHandler类的方法
        // 以拦截SAX事件通知。
        //      
 
        /* 开始解折文析进执行 */
        public void startDocument() throws SAXException {
                System.out.println("SAX Event: START DOCUMENT");
        }
 
        /* 结束解折时执行 */
        public void endDocument() throws SAXException {
                System.out.println("SAX Event: END DOCUMENT");
        }
 
        /* 遇到一个节点时执行 */
        public void startElement(String namespaceURI, String localName,
                        String qName, Attributes attr) throws SAXException {
                System.out.println("SAX Event: START ELEMENT[ " + localName + " ]");
                // System.out.println(namespaceURI+";;;"+qName);
 
                // 如果有属性,打印属性和属性值
                for (int i = 0; i < attr.getLength(); i++) {
                        System.out.println(" ATTRIBUTE: " + attr.getLocalName(i)
                                        + " VALUE: " + attr.getValue(i));
                }
        }
 
        // 元素数据
        public void characters(char[] ch, int start, int length)
                        throws SAXException {
                String s = new String(ch, start, length);
                System.out.println(s);
        }
}
 
这个类实现了内容处理接口的实现,该实现只做了一个简单的处理:把有关XML文文件的内容打印到系统控制台。
 
一个SAXParser类,用于指定解折器并读取XML文档然后调用Handler类的回调方法。代码如下:
package mypack;
 
import java.io.FileReader;
 
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
 
public class SAXTest {
 
        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO 自动产生方法 
                try {
                        // 建立SAX2解折器
                        XMLReader xr = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
 
                        // 安装ContentHandler内容处理类
                        SaxTestHandler handler=new SaxTestHandler();
                        xr.setContentHandler( handler );
 
                        // 解折文檔
                        xr.parse(new InputSource(new FileReader("D://MyProject//Ewebsite//XML//JavaSource//test.xml")));
                } catch (Exception e) {
                        e.printStackTrace();
                }
        }
}
 
执行SAXTest可以打印出test.xml文件的内容(节点名,节点的属性及值,元素内容)
 
二、DOM(Document Object Model)
XML 将数据组织为一棵树,所以DOM就是对这棵树的一个对象描叙。通俗的说,就是通过解折XML文档,为XML文文件在逻辑上建立一个树模型,树的节点就是一 个个对象。我们通过存到这些对象就能够存取XML文档的内容。当XML文档很大时,这个过程可能需要一块相当大的内存,这可能出现内存不足的现象。
 
使用DOM处理的基本步骤如下:
1、实例一个DOMParser。
2、得到一个Document对象。
3、使用Document对象访问代表了XML文文件中元素的节点。
 
XML源被完全读入内存,并用Document对象表示。这就使得应用程序能够随机访问任何节点,这一点也是SAX所不能做到的。
 
一个读取XML文檔的DOM处理示例
package mypack;
 
import java.io.FileReader;
import java.io.IOException;
 
import javax.xml.parsers.ParserConfigurationException;
 
import org.apache.xerces.parsers.DOMParser;//导入DOMParser解折器
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
 
public class DOMTest {
 
        /**
         * @param args
         * @throws ParserConfigurationException
         * @throws IOException
         * @throws SAXException
         */
        public static void main(String[] args) throws ParserConfigurationException,
                        SAXException, IOException {
                // TODO 自动产生方法 Stub
 
                // 实例解折器
                DOMParser parser = new DOMParser();
                // 以Docment对象的形式获取DOM树
                parser.parse(new InputSource(new FileReader(
                                "D://MyProject//Ewebsite//XML//JavaSource//test.xml")));
                Document doc = parser.getDocument();
                // 使用Document对象的方法得到NodeList对象
                NodeList nl = doc.getElementsByTagName("name");
                System.out.println(nl.getLength());// 标签的次数
                Node my_node = nl.item(0);
                // 输出name标签的元素数据
                String name = my_node.getFirstChild().getNodeValue();
                System.out.println(name);
        }
}
 
现在,既然我们已经能够从XML文件中提取出数据了,我们就可以把这些数据用在合适的地方,来构筑应用程序。
 
DOM对象详解
1.基本的DOM对象

DOM的基本对象有5个:Document,Node,NodeList,Element和Attr。下面就这些对象的功能和实现的方法作一个大致的介绍。

Document 对象代表了整个XML的文档,所有其它的Node,都以一定的顺序包含在Document对象之内,排列成一个树形的结构,程序员可以通过遍历这颗树来得 到XML文档的所有的内容,这也是对XML文档操作的起点。我们总是先通过解析XML源文件而得到一个Document对象,然后再来执行后续的操作。此 外,Document还包含了创建其它节点的方法,比如createAttribut()用来创建一个Attr对象。它所包含的主要的方法有:

createAttribute(String):用给定的属性名创建一个Attr对象,并可在其后使用setAttributeNode方法来放置在某一个Element对象上面。

createElement(String):用给定的标签名创建一个Element对象,代表XML文档中的一个标签,然后就可以在这个Element对象上添加属性或进行其它的操作。

createTextNode(String):用给定的字符串创建一个Text对象,Text对象代表了标签或者属性中所包含的纯文本字符串。如果在一个标签内没有其它的标签,那么标签内的文本所代表的Text对象是这个Element对象的唯一子对象。

getElementsByTagName(String):返回一个NodeList对象,它包含了所有给定标签名字的标签。

getDocumentElement():返回一个代表这个DOM树的根节点的Element对象,也就是代表XML文档根元素的那个对象。

Node 对象是DOM结构中最为基本的对象,代表了文档树中的一个抽象的节点。在实际使用的时候,很少会真正的用到Node这个对象,而是用到诸如 Element、Attr、Text等Node对象的子对象来操作文档。Node对象为这些对象提供了一个抽象的、公共的根。

Node 接口是整个文档对象模型的主要数据类型。它表示该文档树中的单个节点。当实现 Node 接口的所有对象公开处理子节点的方法时,不是实现
Node 接口的所有对象都有子节点。例如,Text 节点可能没有子节点,且将子节点添加到这样的节点将导致引发
DOMException
。

包括属性 nodeName、nodeValue 和 attributes 作为一种获取节点信息的机制,无需向下强制转换为特定的派生接口。在没有对特定的
nodeType(如 Element 的 nodeValue 或 Comment 的
attributes)的属性的明显映射的情况下,这将返回 null。注意,特定的接口可能包含其他更方便的机制来获取和设置相关信息。

nodeName、nodeValue 和 attributes 的值将根据以下节点类型的不同而不同。

Interface nodeName nodeValue attributes
Attr 与 Attr.name 相同 与 Attr.value 相同 null
CDATASection "#cdata-section" 与 CharacterData.data 相同,CDATA 节的内容 null
Comment "#comment" 与 CharacterData.data 相同,该注释的内容 null
Document "#document" null null
DocumentFragment "#document-fragment" null null
DocumentType 与 DocumentType.name 相同 null null
Element 与 Element.tagName 相同 null NamedNodeMap
Entity entity name null null
EntityReference 引用的实体名称 null null
Notation notation name null null
ProcessingInstruction 与 ProcessingInstruction.target 相同 与 ProcessingInstruction.data 相同 null
Text "#text" 与 CharacterData.data 相同,该文本节点的内容 null

虽然在Node对象中定义了 对其子节点进行存取的方法,但是有一些Node子对象,比如Text对象,它并不存在子节点,这一点是要注意的。Node对象所包含的主要的方法有:

appendChild(org.w3c.dom.Node):为这个节点添加一个子节点,并放在所有子节点的最后,如果这个子节点已经存在,则先把它删掉再添加进去。

getFirstChild():如果节点存在子节点,则返回第一个子节点,对等的,还有getLastChild()方法返回最后一个子节点。

getNextSibling():返回在DOM树中这个节点的下一个兄弟节点,对等的,还有getPreviousSibling()方法返回其前一个兄弟节点。

getNodeName():根据节点的类型返回节点的名称。

getNodeType():返回节点的类型。

getNodeValue():返回节点的值。

hasChildNodes():判断是不是存在有子节点。

hasAttributes():判断这个节点是否存在有属性。

getOwnerDocument():返回节点所处的Document对象。

insertBefore(org.w3c.dom.Node new,org.w3c.dom.Node ref):在给定的一个子对象前再插入一个子对象。

removeChild(org.w3c.dom.Node):删除给定的子节点对象。

replaceChild(org.w3c.dom.Node new,org.w3c.dom.Node old):用一个新的Node对象代替给定的子节点对象。

NodeList对象,顾名思义,就是代表了一个包含了一个或者多个Node的列表。可以简单的把它看成一个Node的数组,我们可以通过方法来获得列表中的元素:

GetLength():返回列表的长度。

Item(int):返回指定位置的Node对象。

Element对象代表的是XML文档中的标签元素,继承于Node,亦是Node的最主要的子对象。在标签中可以包含有属性,因而Element对象中有存取其属性的方法,而任何Node中定义的方法,也可以用在Element对象上面。

getElementsByTagName(String):返回一个NodeList对象,它包含了在这个标签中其下的子孙节点中具有给定标签名字的标签。

getTagName():返回一个代表这个标签名字的字符串。

getAttribute(String): 返回标签中给定属性名称的属性的值。在这儿需要主要的是,应为XML文档中允许有实体属性出现,而这个方法对这些实体属性并不适用。这时候需要用到 getAttributeNodes()方法来得到一个Attr对象来进行进一步的操作。

getAttributeNode(String):返回一个代表给定属性名称的Attr对象。

Attr 对象代表了某个标签中的属性。Attr继承于Node,但是因为Attr实际上是包含在Element中的,它并不能被看作是Element的子对象,因 而在DOM中Attr并不是DOM树的一部分,所以Node中的getparentNode(),getdivviousSibling()和
getnextSibling()返回的都将是null。也就是说,Attr其实是被看作包含它的Element对象的一部分,它并不作为DOM树中单独 的一个节点出现。这一点在使用的时候要同其它的Node子对象相区别。

需要说明的是,上面所说的DOM对象在DOM中都是用接口定义的, DOM其实可以在任何面向对象的语言中实现,只要它实现了DOM所定义的接口和功能就可以了。

 

三、JAXP

1、用SAX处理XML

下面是JAXP的操作示范

(1)   创建已实现的Handler类的实例。

(2)   利用SAXParserFactory的静态方法newInstance()方法获取一个factory类。

(3)   通过newSAXParser()静态方法从factory中获取SAX分折器。

(4)   分折XML数据:调用SAXParser的分折方法,把XML输入作为第一个参数,而Handler实现方案作为第二个参数。

 

 

示例代码如下:

package mypack;

 

import java.io.IOException;

 

import javax.xml.parsers.ParserConfigurationException;

import javax.xml.parsers.SAXParser;

import javax.xml.parsers.SAXParserFactory;

 

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

 

public class JaxpSaxTest {

        /**

         * @param args

         * @throws SAXException 

         * @throws ParserConfigurationException 

         * @throws IOException 

         */

        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {

                // TODO 自动产生方法 Stub

                //实例一个内容处理类

                DefaultHandler handler=new SaxTestHandler();

                //得到厂类

                SAXParserFactory factory=SAXParserFactory.newInstance();

                //在厂类中获取SAX分折器

                SAXParser parser=factory.newSAXParser();

                //分折XML数据

                parser.parse("D://MyProject//Ewebsite//XML//JavaSource//test.xml",handler);

        }

}

 

2、用DOM处理

 

步聚如下: 

(1)初始化一个新的Builder类。Builder类负责读取XML数据并把XML数据转化为树状表示。

(2)一旦数据转化完成,即创建Document对象。一旦对象创建后,以后所有的对XML文档的操作都与解折器无关了。

(3) 使用Document对象访问代表了XML文文件中元素的节点。

 

示例代码如下:

package mypack;

 

import java.io.IOException;

 

import javax.xml.parsers.DocumentBuilder;

import javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

 

import org.w3c.dom.Document;

import org.w3c.dom.Node;

import org.w3c.dom.NodeList;

import org.xml.sax.SAXException;

 

public class JaxpDomTest {

        /**

         * @param args

         * @throws ParserConfigurationException

         * @throws IOException

         * @throws SAXException

         */

        public static void main(String[] args) throws ParserConfigurationException,

                        SAXException, IOException {

                // TODO 自动产生方法 Stub

 

                // 实例一个Builder类,用DocumentBuilder的目的是为了创建与具体解折器无关的程序

                // 厂类的静态方法newInstance()被调用时,它根据一个系统变量来决定具体使用哪一个解折器。

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

                DocumentBuilder builder = factory.newDocumentBuilder();

 

                // 创建Document对象

                Document document = builder

                                .parse("D://MyProject//Ewebsite//XML//JavaSource//test.xml");

 

                // 使用Document对象的方法得到NodeList对象

                NodeList nl = document.getElementsByTagName("name");

                System.out.println(nl.getLength());// 标签的次数

                Node my_node = nl.item(0);

                // 输出name标签的元素数据

                String name = my_node.getFirstChild().getNodeValue();

                System.out.println(name);

        }

 

}

http://www.99inf.net/SoftwareDev/Java/43727.htm

JAXP(Java API for XML Parsing)的更多相关文章

  1. Java原生API操作XML

    使用Java操作XML的开源框架比较多,如著名的Dom4J.JDOM等,但个人认为不管你用那个框架都要对JDK原生的API有所了解才能更得心应手的应用.本篇就来简单了解下原生的XML API. JAV ...

  2. Java API 各个包的内容解释

    java.applet 提供创建 applet 所必需的类和 applet 用来与其 applet 上下文通信的类. java.awt 包含用于创建用户界面和绘制图形图像的所有类. java.awt. ...

  3. 【Java密码学】用Java数字签名提供XML安全

    简介 众所周知,XML在产品和项目开发中起着非常重要的作用.通过XML文档可以获取很多信息,还可以使用XML文件进行CRUD(增加.查询.更新和删除)操作.然而值得注意的是,我们如何确保XML中的数据 ...

  4. 2.技巧: 用 JAXM 发送和接收 SOAP 消息—Java API 使许多手工生成和发送消息方面必需的步骤自动化

    转自:https://www.cnblogs.com/chenying99/archive/2013/05/23/3094128.html 技巧: 用 JAXM 发送和接收 SOAP 消息—Java ...

  5. XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax

    本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...

  6. nested exception is java.lang.RuntimeException: Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'daoSupport': ...

  7. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  8. java生成解析xml的另外两种方法Xstream

    Xstream生成和解析xm和JAXB生成和解析xml的方法. 一,Xstream Xstream非jdk自带的,需要到入Xstream-1.4.3.jar和xpp3_min-1.1.4.jar 1. ...

  9. 源生API解析XML文档与dom4j解析XML文档

    一.XML语言 XML是一种可扩展的标记语言,是一种强类型的语言,类似HTML(超文本标记语言,是一种弱类型的语言).XML是一种通用的数据交换格式(关系型数据库),综上所诉:XML可以传输数据,也可 ...

  10. Java SE之XML<二>XML DOM与SAX解析

    [文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...

随机推荐

  1. Android Adapter分页显示异常: 首页数据在屏幕内全显示,无法上滑分页

    前情提要: Android 端Adapter分页,下拉刷新,上滑分页, 原有流程:上滑时,滑动触及底部,触发Adapter的onScrolled的方法 异常情况:第一页数据完全显示,导致上滑时,未触及 ...

  2. Element Plus使用

    目录 Element Plus快速入门 常用组件 Element:是饿了么团队研发的,基于 Vue 3,面向设计师和开发者的组件库. 组件:组成网页的部件,例如 超链接.按钮.图片.表格.表单.分页条 ...

  3. HTB-Runner靶机笔记

    HTB-Runner靶机笔记 概述 Runner是HTB上一个中等难度的Linux靶机,它包含以下teamcity漏洞(CVE-2023-42793)该漏洞允许用户绕过身份验证并提取API令牌.以及d ...

  4. vue中代理解决跨域

    跨域是什么 简单的讲就是你在一个地方使用另一个地方的资源,被浏览器给挡下来了,不让不用!当然,它挡下来是有自己理由的:为了安全(╬▔皿▔)╯. 解决跨域 我是用vue开发的,就vue代理模式解决跨域说 ...

  5. three.js添加3d模型

    three官方的几何体也就那么几个,想要生成各种各样的模型,其难度十分之大,这时引入外部模型也不失为一种选择.具体引入办法如下. 导入依赖 点击查看代码 import * as THREE from ...

  6. Argo CD初体验

    什么是 Argo CD? Argo CD 是一个声明式的 GitOps 持续交付工具,用于 Kubernetes 集群.它通过持续监控 Git 仓库中的 Kubernetes 资源配置文件,将这些配置 ...

  7. 使用 nuxi preview 命令预览 Nuxt 应用

    title: 使用 nuxi preview 命令预览 Nuxt 应用 date: 2024/9/8 updated: 2024/9/8 author: cmdragon excerpt: 摘要:本文 ...

  8. python学习教材选哪个

    python语言俨然成为当今最流行的国际语言,无论你是做AI的还是非AI,大家都在用python语言,各种平台也都开始支持python,现在连文科生都在学习python语言了,甚至很多表哥表姐的工作都 ...

  9. 商业银行国际结算规模创新高,合合信息AI助力金融行业智能处理多版式文档

    随着我国外贸新业态的快速增长,银行国际结算业务在服务实体经济发展.促进贸易投资便利化进程中发挥了越来越重要的作用.根据中国银行业协会近日发布的<中国贸易金融行业发展报告(2023-2024)&g ...

  10. 腾讯自研Git客户端,助力每个人都可以轻松使用Git

    工具介绍 UGit是一款腾讯自研的Git客户端,为了让每个人都可以轻松使用Git,从而提高开发效率和团队协作的流畅性.支持工蜂MR/CR,工蜂议题管理,另外对于Git的原生特性有着深度支持. 支持的系 ...