xml异常-SAX无法解析root。不知道是不是bug

问题描述

SAX无法解析root。不知道是不是bug

有两种情况

这种格式化的XML是能解析:

 <xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>

没有格式化不能被正确解析:

 <xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>

解析到就解析不出标签.不执行此方法
public void characters(char ch[], int start, int length)


import java.io.ByteArrayInputStream;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Vector;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.json.simple.JSONObject;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XMLParser extends DefaultHandler {

    private Vector<String> tagName;

    private Vector<String> tagValue;

    private int step;

    private Map<String, String> map = new LinkedHashMap<String, String>();

    // 开始解析XML文件
    public void startDocument() throws SAXException {
        tagName = new Vector<String>();
        tagValue = new Vector<String>();
        step = 0;
    }

    // 结束解析XML文件
    public void endDocument() throws SAXException {
        for (int i = 0; i < tagName.size(); i++) {
            if (!tagName.get(i).equals("") || tagName.get(i) != null) {
                map.put(tagName.get(i), tagValue.get(i));
                //System.out.println("节点名称:" + tagName.get(i));
                //System.out.println("节点值:" + tagValue.get(i));
            }
        }
    }

    /**
     * 在解释到一个开始元素时会调用此方法.但是当元素有重复时可以自己写算法来区分 这些重复的元素.qName是什么? <name:page
     * ll=""></name:page>这样写就会抛出SAXException错误 通常情况下qName等于localName
     */
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        tagName.add(qName);// 节点名称

        /*
        for (int i = 0; i < attributes.getLength(); i++) {// 循环输出属性
            System.out.println("属性名称:" + attributes.getQName(i));// 获取属性名称
            System.out.println("属性值:"+ attributes.getValue(attributes.getQName(i)));// 获取属性值
        }
        */
    }

    /**
     * 在遇到结束标签时调用此方法
     */
    public void endElement(String uri, String localName, String qName)
            throws SAXException {

        step = step + 1;
    }

    /**
     * 读取标签里的值,ch用来存放某行的xml的字符数据,包括标签,初始大小是2048, 每解释到新的字符会把它添加到char[]里。 *
     * 注意,这个char字符会自己管理存储的字符, 并不是每一行就会刷新一次char,start,length是由xml的元素数据确定的,
     * 暂时找不到规律,以后看源代码.
     *
     * 这里一个正标签,反标签都会被执行一次characters,所以在反标签时不用获得其中的值
     */
    public void characters(char ch[], int start, int length)
            throws SAXException {
        // 只要当前的标签组的长度一至,值就不赋,则反标签不被计划在内
        if (tagName.size() - 1 == tagValue.size()) {
            tagValue.add(new String(ch, start, length));

        }
    }

    public Map<String, String> xmlConvertMap(String xmlContent){

        SAXParserFactory spf = SAXParserFactory.newInstance();
        try {
            SAXParser saxParser = spf.newSAXParser();
            XMLParser parseXML = new XMLParser();

            saxParser.parse(new ByteArrayInputStream(xmlContent.getBytes("utf-8")), parseXML);
            return parseXML.map;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    @SuppressWarnings("unchecked")
    public JSONObject xmlConvertJson(String xmlContent){
        Map<String, String> tempMap = xmlConvertMap(xmlContent);
        JSONObject json = new JSONObject();
        json.putAll(tempMap);
        return json;
    }
}
时间: 2024-08-31 19:33:57

xml异常-SAX无法解析root。不知道是不是bug的相关文章

Android网络之数据解析----SAX方式解析XML数据

[正文] 一.XML和Json数据的引入: 通常情况下,每个需要访问网络的应用程序都会有一个自己的服务器,我们可以向服务器提交数据,也可以从服务器获取数据.不过这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这种数据会有一定的结构规格和语言,当另一方受到数据消息后就可以按照相同的结构规格进行解析,从而取出它想要的那部分内容. 在网络上传输数据最常用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数据解析将在下一篇文

python sax模块解析xml遇到非法字符怎么解决?

问题描述 python sax模块解析xml遇到非法字符怎么解决? 1C 用python的sax模块解析xml的时候出现非法字符直接停止了,百度搜到有大神说用回调函数处理当前的非法字符或者跳过直接运行接下来的内容.不过具体应该怎么实现呢?求大神赐教.下面是我的代码,非法字符是出现再其中的很多个tagname=""url""中的内容,能在原来的基础上改就更好了,再次感谢 import xml.saxclass XmlHandler( xml.sax.ContentHa

java的xml编程(sax)

xml|编程 当前SAX API有两个版本.我们用第二版(见资源)来做示例.第二版中的类名和方法名与第一版都有出入,但是代码的结构是一样的. SAX是一套API,不是一个解析器,所以这个代码在XML解析器中是通用的.要让示例跑起来,你将需要一个支持SAX v2的XML解析器.我用Apache的Xerces解析器.(见资源)参照你的解析器的getting-started文档来获得调用一个SAX解析器的资料. SAX API 的说明书通俗易读.它包含了很多的详细内容.而使用SAX API的主要任务就

Swift学习笔记(2)网络数据交换格式(XML,JSON)解析 [iOS实战 入门与提高卷]

Swift学习笔记(2)网络数据交换格式(XML,JSON)解析 参考书籍及资源:iOS实战 入门与提高卷 关东升 参考书籍地址 用NSXML来解析XML文档 用TBXML来解析XML文档 用NSJSONSerialization来解析JSON文档 目录 Swift学习笔记2网络数据交换格式XMLJSON解析 目录 用NSXML来解析XML文档 示例文档Notesxml 创建XMLParser类 调用与运行结果 用TBXML来解析XML文档 准备工作 创建XMLParser类 调用与运行结果 用

Qt之XML(SAX)

简述 SAX(Simple API for XML)是用于 XML 解析器的基于事件的标准接口.XML 类的设计遵循 SAX2 Java interface,名称适合 Qt 的命名约定.对于任何使用 SAX2 的人来说,使用 Qt XML 类应该非常容易. SAX 不同于 DOM 解析,它逐行扫描文档,一边扫描一边解析.由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中,这对于大型文档的解析是个巨大优势. Qt XML 模块提供了一个抽象类 QXmlReader,它定义了潜在的

PHP生成XML格式数据与解析xml数据程序

先看xml文档  代码如下 复制代码 <?xml version="1.0" encoding="utf-8"?> <article>     <item>         <title size="1">title1</title>         <content>content1</content>         <pubdate>2009-1

10分钟掌握XML、JSON及其解析_基础知识

引言 NOKIA 有句著名的广告语:"科技以人为本".任何技术都是为了满足人的生产生活需要而产生的.具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角.不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用其成果来为人们的需求服务. 随着移动互联网时代的大潮,越来越多的App不光是需要和网络服务器进行数据传输和交互,也需要和其他 App 进行数据传递.承担

js XMLDOM解析xml 文档实例解析

js XMLDOM解析xml 文档实例解析 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta htt

Java眼中的XML--文件读取--2 应用SAX方式解析XML

1.获取一个SAXParserFactory的实例.2.通过factory获取SAXParser实例. 3.新建一个包和继承自DefaultHandler的类. 因为SAX遍历方式,比如便利一个节点<a></a>是需要startHandler便利起始标签<a>,还需要endHandler便利结束标签</a>. 4.将XML文件路径和SAXParserHandler实例对象作为 SAXParser对象 的参数使用.然后运行验证执行初始情况. 5.在SAXPar