问题描述
- 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