当前位置: 首页 > news >正文

xml的SAX解析过程详解

  Xml技术简介
Xml文件有两种约束类型,包括文档类型定义(DTD)和Xml 模式(Schema)。Xml DTD被包含在xml1的标准里。Xml 模式被包含在W3C的标准中。在xml 数据和xml 模式两者之间有很多的区别。
A. xml模式支持的数据类型比xml DTD多;
B. xml模式在无序的情况下使用起来比xml DTD更方便;
C. xml模式支持名字空间,可以在不同的文件中定义相同的方法等。
D. xml模式形成的文档可以被多种标准解析,如dom,sax或者jdom等,而xml DTD方式下确不行。
SAX解析方式
上面我简要介绍了几种解析xml文件的技术,这里我们使用SAX技术给出一个小例子,大家可以从这个例子中发现如果你能够掌握一些开源软件包,你就可以很快掌握解析xml数据的技术。
制作一个简单的xml文件component.xml
<?xml version="1.0"?>
<XmlComponents>
<XmlComponent>
<ComNo>1</ComNo>
</XmlComponent>
</XmlComponents>
下载xerces.jar软件包
在Apache网站上×××下载xerces.jar软件包,这个包中包含了上面我们列举的几种解析xml数据的API。然后将这个软件包加入到程序的classpath中。
制作解析类MySaxParser.java
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;

public class MySaxParser extends DefaultHandler {
private static int INDENT = 2;

// 运行主方法
public static void main(String[] argv) {
// if (argv.length != 1) {
// System.out.println("Usage: java ds.MySaxParser [URI]");
// System.exit(0);
// }
System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");
// String uri = argv[0];
String uri = "Components.xml";
try {
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setValidating(false);
parserFactory.setNamespaceAware(false);
MySaxParser MySaxParserInstance = new MySaxParser();
SAXParser parser = parserFactory.newSAXParser();
parser.parse(uri, MySaxParserInstance);
}
catch(IOException ex) {
ex.printStackTrace();
}
catch(SAXException ex) {
ex.printStackTrace();
}
catch(ParserConfigurationException ex) {
ex.printStackTrace();
}
catch(FactoryConfigurationError ex) {
ex.printStackTrace();
}

}

private int idx = 0; //indent
// 处理各种分隔符号
public void characters(char[] ch, int start, int length) throws SAXException {
//instantiates s, indents output, prints character values in element
String s = new String(ch, start, length);
if (!s.startsWith("/n")) //空的value不打印
System.out.println(getIndent()+ " Value: " + s);
}

// 处理文档尾
public void endDocument() throws SAXException {
idx -= INDENT;
System.out.println(getIndent() + "end document");

System.out.println("...PARSING ends");
}

// 处理标记尾
public void endElement(String uri, String localName, String qName) throws SAXException {
idx -= INDENT;
}

// 处理文档的起始点
public void startDocument() throws SAXException {
idx += INDENT;
System.out.println("PARSING begins...");
System.out.println(getIndent() + "start document: ");
}

// 处理标记头
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
idx += INDENT;
System.out.println('/n' + getIndent() + "start element: " + qName);

}

private String getIndent() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < idx; i++)
sb.append(" ");
return sb.toString();
}

}


总结,虽然解析xml数据很复杂,因为涉及了很多的递归算法,但是我们可以使用业界比较成熟的解析API来进行xml数据处理。我现在只是给出了一个非常简单的例子,但是在真实系统中远比这个要复杂的多,大家以后在使用的使用会发现还是有很多的工作要做的。 

相关文章:

  • xml文件操作(利用dom4j)
  • aspx页面导出为word
  • mysql优化之索引优化
  • 使用SAX解析XML
  • AJAX实现类Google Suggest效果
  • Android:百度地图 + 百度导航
  • 文章太长了!~关于 XML 的一些基础知识
  • iOS: FFmpeg的使用一
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • HD1285(拓扑排序)
  • 如何用javascript设置延时执行
  • 设计模式--3.模板方法模式
  • 实现JSP数据和JavaScript数据交互使用
  • 使用Apache Xerces解析XML文档
  • 禁ping以及清理系统多余账号说明
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • 【Amaple教程】5. 插件
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • css的样式优先级
  • ES2017异步函数现已正式可用
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • express如何解决request entity too large问题
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • JS题目及答案整理
  • SSH 免密登录
  • 基于webpack 的 vue 多页架构
  • 让你的分享飞起来——极光推出社会化分享组件
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 推荐一个React的管理后台框架
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 终端用户监控:真实用户监控还是模拟监控?
  • 积累各种好的链接
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (20050108)又读《平凡的世界》
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Forward) Music Player: From UI Proposal to Code
  • (力扣)1314.矩阵区域和
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (转)重识new
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .gitignore文件—git忽略文件
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 5种线程安全集合
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .NET多线程执行函数
  • .net流程开发平台的一些难点(1)
  • [ IO.File ] FileSystemWatcher
  • [ vulhub漏洞复现篇 ] JBOSS AS 5.x/6.x反序列化远程代码执行漏洞CVE-2017-12149
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [Angularjs]ng-select和ng-options