xuchuandi 2015-10-27 06:16 采纳率: 0%
浏览 580

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;
    }
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 高德地图点聚合中Marker的位置无法实时更新
    • ¥15 DIFY API Endpoint 问题。
    • ¥20 sub地址DHCP问题
    • ¥15 delta降尺度计算的一些细节,有偿
    • ¥15 Arduino红外遥控代码有问题
    • ¥15 数值计算离散正交多项式
    • ¥30 数值计算均差系数编程
    • ¥15 redis-full-check比较 两个集群的数据出错
    • ¥15 Matlab编程问题
    • ¥15 训练的多模态特征融合模型准确度很低怎么办