- 浏览: 167434 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
cmm13655612162:
zhai4902176 写道 写的真不错,作为基础很薄弱的我理 ...
SAX解析XML 详解 -
kisso143:
写的很详细,不错,收藏一下
SAX解析XML 详解 -
zhai4902176:
写的真不错,作为基础很薄弱的我理解的还是挺浅的。请问楼主 “ ...
SAX解析XML 详解 -
ahzdc:
讲的很好啊
JAVA 注解示例 详解 -
elisonwell:
不错,我喜欢
JAVA 注解示例 详解
下面是一个将XML转换为JSON的示例,
通过SAX来解析XML,从而生成相应的JSON字符串
自我感觉还算是一个比较通用的 API ,主要包含3个类
1, ToJsonSAXHandler 类 继承了 DefaultHandler 类,在解析
XML的过程中负责处理 SAX 事件。代码如下:
package org.yjf.xmlToJson; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class ToJsonSAXHandler extends DefaultHandler { //jsonStringBuilder 保存解析XML时生成的json字符串 private StringBuilder jsonStringBuilder ; /* * isProcessing 表示 是否正在解析一个XML * startDocument 事件发生时设置 isProcessing = true * startDocument 事件发生时设置 isProcessing = false */ private boolean isProcessing; /* * justProcessStartElement 表示 是否刚刚处理完一个 startElement事件 * 引入这个标记的作用是为了判断什么时候输出逗号 */ private boolean justProcessStartElement; public ToJsonSAXHandler(){ jsonStringBuilder = new StringBuilder(); } @Override public void startDocument() throws SAXException { /* * 开始解析XML文档时 设定一些解析状态 * 设置isProcessing为true,表示XML正在被解析 * 设置justProcessStartElement为true,表示刚刚没有处理过 startElement事件 */ isProcessing = true; justProcessStartElement = true; //清空 jsonStringBuilder 中的字符 this.jsonStringBuilder.delete(0, this.jsonStringBuilder.length()); } @Override public void endDocument() throws SAXException { isProcessing = false; } @Override public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { /* * 是否刚刚处理完一个startElement事件 * 如果是 则表示这个元素是父元素的第一个元素 。 * 如果不是 则表示刚刚处理完一个endElement事件,即这个元素不是父元素的第一个元素 */ if(!justProcessStartElement){ jsonStringBuilder.append(','); justProcessStartElement = true; } jsonStringBuilder.append("{"); jsonStringBuilder.append("localName:").append('\"').append(localName).append('\"').append(','); jsonStringBuilder.append("uri:").append('\"').append(uri).append('\"').append(','); jsonStringBuilder.append("qName:").append('\"').append(qName).append('\"').append(','); //将解析出来的元素属性添加到JSON字符串中 jsonStringBuilder.append("attrs:{"); if(attrs.getLength() > 0){ jsonStringBuilder.append(attrs.getLocalName(0)).append(":") .append(attrs.getValue(0)); for(int i = 1 ; i < attrs.getLength() ; i++){ jsonStringBuilder.append(',').append(attrs.getLocalName(i)).append(":") .append(attrs.getValue(i)); } } jsonStringBuilder.append("},"); //将解析出来的元素的子元素列表添加到JSON字符串中 jsonStringBuilder.append("childElements:[").append('\n'); } @Override public void endElement(String uri,String localName,String qName) throws SAXException { justProcessStartElement = false; jsonStringBuilder.append("]}").append('\n'); } @Override public void characters(char[] ch, int begin, int length) throws SAXException { /* * 是否刚刚处理完一个startElement事件 * 如果是 则表示这个元素是父元素的第一个元素 。 * 如果不是 则表示刚刚处理完一个endElement事件,即这个元素不是父元素的第一个元素 */ if(!justProcessStartElement){ jsonStringBuilder.append(','); }else justProcessStartElement = false; jsonStringBuilder.append('\"'); for(int i = begin ; i < begin+length ; i++){ switch(ch[i]){ case '\'':jsonStringBuilder.append("\\'");break; case '\"':jsonStringBuilder.append("\\\"");break; case '\n':jsonStringBuilder.append("\\n");break; case '\t':jsonStringBuilder.append("\\t");break; case '\r':jsonStringBuilder.append("\\r");break; default: jsonStringBuilder.append(ch[i]);break; } } jsonStringBuilder.append('\"').append('\n'); } public String getJsonString() throws XMLToJSONException{ if(this.isProcessing) throw new XMLToJSONException("getJsonString before resolution is finished"); else return jsonStringBuilder.toString(); } }
2,XMLToJSONException 是一个异常类(封装在转换过程中可能产生的异常),代码如下:
package org.yjf.xmlToJson; public class XMLToJSONException extends Exception { private static final long serialVersionUID = 1L; public XMLToJSONException(){} public XMLToJSONException(String message){ super(message); } }
3,XMLToJSON 类 是一个将XML转换为JSON字符串的工具类
package org.yjf.xmlToJson; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.StringReader; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; public class XMLToJSON { public static String convert(String xmlStr) throws SAXException, IOException, XMLToJSONException { return convert(new InputSource(new StringReader(xmlStr))); } public static String convert(File file) throws SAXException, IOException, XMLToJSONException { return convert(new InputSource(new FileInputStream(file))); } public static String convert(InputSource inputSource) throws SAXException, IOException, XMLToJSONException { ToJsonSAXHandler handler = new ToJsonSAXHandler(); //创建一个 SAX 解析器 ,并设置这个解析器的内容事件处理器 和 错误事件处理器 为 handler XMLReader reader = XMLReaderFactory.createXMLReader(); reader.setContentHandler(handler); reader.setErrorHandler(handler); //用 SAX 解析器解析XML输入源 reader.parse(inputSource); //返回 ToJsonSAXHandler 中保存的 json字符串 return handler.getJsonString(); } }
测试类 Test 如下 (因为生成的JSON不包含缩进,所以看起来可能不太直观,所以我用了JSONObject类来打印带有缩进的JSON字符串,同时也验证了转换出来的JSON字符串是一个有效的JSON字符串):
package test; import java.io.File; import java.io.IOException; import org.json.JSONException; import org.json.JSONObject; import org.xml.sax.SAXException; import org.yjf.xmlToJson.XMLToJSON; import org.yjf.xmlToJson.XMLToJSONException; public class Test_1 { public static void main(String[] args) throws JSONException, SAXException, IOException, XMLToJSONException{ String jsonStr = XMLToJSON.convert(new File("books.xml")); /* * JSONObject 是一个JSON对象的java实现 * 可以通过用一个有效的JSON字符串来构造JSON对象 * 下面的两行代码通过转换而来的JSON字符串构造了一个JSON对象, * 并且打印出了这个JSON对象的带有缩进的字符串表示 */ JSONObject jsonObj = new JSONObject(jsonStr); System.out.println(jsonObj.toString(2)); } }
books.xml 的内容如下:
<?xml version="1.0" encoding="utf-8"?> <books count="2" xmlns="http://test.org/books"> <book id="1" page="1000"> <name>Thinking in JAVA</name> </book> <book id="2" page="800"> <name>Core JAVA2</name> </book> </books>
运行 Test 类输出的JSON字符串 如下:
{
"attrs": {"count": 2},
"childElements": [
"\n\t",
{
"attrs": {
"id": 1,
"page": 1000
},
"childElements": [
"\n\t\t",
{
"attrs": {},
"childElements": ["Thinking in JAVA"],
"localName": "name",
"qName": "name",
"uri": "http://test.org/books"
},
"\n\t"
],
"localName": "book",
"qName": "book",
"uri": "http://test.org/books"
},
"\n\t",
{
"attrs": {
"id": 2,
"page": 800
},
"childElements": [
"\n\t\t",
{
"attrs": {},
"childElements": ["Core JAVA2"],
"localName": "name",
"qName": "name",
"uri": "http://test.org/books"
},
"\n\t"
],
"localName": "book",
"qName": "book",
"uri": "http://test.org/books"
},
"\n"
],
"localName": "books",
"qName": "books",
"uri": "http://test.org/books"
}
附件包含上面示例的源文件
- src.rar (6.8 KB)
- 下载次数: 771
评论
<?xml version="1.0" encoding="GB2312"?><xml><version>v1.0</version><state>100</state><message>获取期号列表成功</message><list><row opencode="" expect="09128" active="1" addendtime="2009-11-01 19:15:00" buyendtime="2009-11-01 19:15:00" opentime="2009-10-29 19:33:32" allowbuy="1" duizhen="" /></list><curtime>2009-11-01 18:42:44</curtime></xml>
我看了一下,解析字符串把row 属性解析在一起了,请指教。
</p>
<p style="margin: 0px;">用books.book[0].name表达式来返回一个书名的还是不太好</p>
<p style="margin: 0px;">我们怎么知道books.book[0].name一定是一个元素,我觉得把它</p>
<p style="margin: 0px;">看作一个元素列表更恰当,</p>
<p style="margin: 0px;">即用books.book[0].name[0].text来返回"Thinking in java"</p>
<p style="margin: 0px;">怎么看起来有点像XPath了 呵呵</p>
<p style="margin: 0px;">研究研究</p>
<p> </p>
<p> </p>
<p> </p></div><br/>估计用DOM来解析更方便些
</p>
<p style="margin: 0px;">用books.book[0].name表达式来返回一个书名的还是不太好</p>
<p style="margin: 0px;">我们怎么知道books.book[0].name一定是一个元素,我觉得把它</p>
<p style="margin: 0px;">看作一个元素列表更恰当,</p>
<p style="margin: 0px;">即用books.book[0].name[0].text来返回"Thinking in java"</p>
<p style="margin: 0px;">怎么看起来有点像XPath了 呵呵</p>
<p style="margin: 0px;">研究研究</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<pre name="code" class="java"><span><span style="color: #0000ff; font-size: small;">var books = {
"attrs": {"count": 2},
"childElements": [
"\n\t",
{
"attrs": {
"id": 1,
"page": 1000
},
"childElements": [
"\n\t\t",
{
"attrs": {},
"childElements": ["Thinking in JAVA"],
"localName": "name",
"qName": "name",
"uri": "http://test.org/books"
},
"\n\t"
],
"localName": "book",
"qName": "book",
"uri": "http://test.org/books"
},
"\n\t",
{
"attrs": {
"id": 2,
"page": 800
},
"childElements": [
"\n\t\t",
{
"attrs": {},
"childElements": ["Core JAVA2"],
"localName": "name",
"qName": "name",
"uri": "http://test.org/books"
},
"\n\t"
],
"localName": "book",
"qName": "book",
"uri": "http://test.org/books"
},
"\n"
],
"localName": "books",
"qName": "books",
"uri": "http://test.org/books"
}</span> </span></pre>
<p><span>
如果用JS访问感觉还是不太方便,如果要访问“Thinking in java”这个文本,</span></p>
<p><span>需要 用这个表达式 <span style="font-family: Arial; white-space: normal; line-height: 18px;"><span style="color: #0000ff;"><span style="font-size: small;">books</span></span></span><span style="color: #0000ff;"><span style="font-size: small;">.childElements[2].childElements[1].childElements[0] </span></span></span></p>
<p><span>这样看起来不是很直观 ,感觉要是用这个表达式 <span style="color: #0000ff;"><span style="font-size: small;">books</span></span><span><span style="color: #0000ff;"><span style="font-size: small;">.book[0].name就更直观了</span></span></span></span></p>
<p> </p>
发表评论
-
SAX解析XML 之 坏毛豆过滤器
2009-06-06 15:19 1862在平时的学习中,一些生动简洁的示例总是能让我们更快更好地接受。 ... -
SAX解析XML 详解
2009-06-03 23:08 33588JAVA 解析 XML 通常 ... -
DOM 与 DOM 解析详解(四)以DOM方式解析XML
2009-06-02 22:27 2310以 DOM 方式解析XML文档,示例如下(标有详细注释 ... -
DOM 与 DOM 解析详解(三)以 DOM 方式创建xml文档
2009-06-02 20:56 3326以 DOM 方式创建XML文档,示例如下(标有详细注释 ... -
DOM 与 DOM 解析详解(二)关于 DOMImplementation
2009-06-02 19:40 1906关于DOMImplementation 类 的 示例 ... -
DOM 与 DOM 解析详解(一)基础
2009-06-02 19:04 3232首先有必要了解一下什么是 DOM ? 下面是DOM的 ...
相关推荐
SAX解析XML文件的实例。一个项目同时用dom解析和sax解析xml文件貌似会报错,项目框架建一直是用sax和dom4j解析xml文件的。当我用dom解析xml文件。导入包后就报错识别不了xml文件的编码格式。于是做了一个sax解析xml...
XML通过SAX解析为JSON格式的文档 例子中的类稍微修改可以做做到公用
SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码 SAX解析超大XML文件 示例代码
Sax解析XML文件解
sax解析xml实例
XML解析之SAX解析DEMO,之前在播控上有介绍,但是代码排版太乱了,这个就是Android4.0网络编程中的SAX解析例子。
java学习笔记——使用DOM解析XML和使用SAX解析XML
Java SAX解析Xml Demo(详细注释)
使用SAX方式解析XML SAX 是读取和操作 XML 数据的更快速、更轻量的方 法。SAX 允许您在读取文档时处理它,从而不必等待整个文档被存储之后才采取操作。它不涉及 DOM 所必需的开销和概念跳跃。 SAX API是一个基于事件...
Dom,Sax,Xpath解析XML实例,有源码,实例。简单易用,直接可用
Sax解析xml文件详细例子,解析复杂节点的xml,把内容显示到view中,例子简单完整,易用
camaro camaro是一种实用程序,它使用Node.js绑定到本地XML解析器pugixml(一种最快的XML解析器),将XML转换为JSON。 具有将XML转换为JSON的功能。 仅接受camaro camaro的属性,即camaro是将Node.js绑定到本地XML...
Servlet利用SAX解析XML文档,JAX,JSWDP,Servlet利用SAX解析XML文档
NULL 博文链接:https://mazhihui.iteye.com/blog/1535280
一个完整的详细的Dom4JSAX解析实例和SAX解析实例例子!
绝对可用的SAX解析XML文件项目,费了九牛二虎之力,才找到的好资源,特与大家共享出来。直接导入eclipse就可运行,无需任何配置。
使用sax解析xml的源代码
<?xml version="1.0" encoding="utf-8"?> <users> <user id="A001"> <name>zhaoyun</name> <age>40</age> </user> <user id="b001"> <name>Liubie</name> <age>25</age> </user> </users>
sax解析XML方式的代码及特点,sax解析XML方式的代码及特点,sax解析XML方式的代码及特点,sax解析XML方式的代码及特点