Java 中的两种xml解析
集合操作时Java NoSuchElementException异常,Iterator
2010 年 5 月 20 日(整理)
此文章内容主要记录了嵌套遍历集合时,因为一时疏忽出现的NoSuchElementException问题
今天代码同步完毕启用应用系统,发现后台打出了个NoSuchElementException异常,因为这只是应用中的一加载模块,并没影响正常工作。哈哈,但好奇心,让我跟了进去。
其它这个bug比较低级,完全是因为编码时的疏忽造成的。
![]() ![]() |
这段代码主要作用是xml解析方式的测试,因为也需要用到集合存储数据,只需小改一下错误就能重现了。
package org.ybygjy.xml; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** * xml文件解析 * @author WangYanCheng * @version 2010-5-7 */ public class XMLParserTest { /** * 解析字符串为xml * @param xmlSrc xmlSrc */ public void parserStr2XML(String xmlSrc) { try { SAXParser saxParser = SAXParserFactory.newInstance().newSAXParser(); InputStream ins = new FileInputStream(new File("c://1")); ParserXML4Sax pxsInst = new ParserXML4Sax(); saxParser.parse(ins, pxsInst); List<map> rtnList = pxsInst.getRtnList(); for (Iterator<map> iterator = rtnList.iterator(); iterator.hasNext();) { Map mapInst = iterator.next(); /*for (Iterator mapIterator = mapInst.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = mapIterator.next(); System.out.println(entry.getKey() + ":" + entry.getValue()); }*/ doPrint(mapInst); } } catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } } /** * 使用dom方式解析xml * @param file fileInst */ public void parserXMLUsedDom(File file) { DocumentBuilder dbInst = null; Document docInst = null; try { dbInst = DocumentBuilderFactory.newInstance().newDocumentBuilder(); docInst = dbInst.parse(file); } catch (SAXException saxe) { saxe.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } Element elem = docInst.getDocumentElement(); System.out.println("ServiceName:" + elem.getAttribute("SERVICENAME")); NodeList nodeList = elem.getElementsByTagName("Task"); int len = nodeList.getLength(); for (int index = 0; index < len; index++) { Node tmpNode = nodeList.item(index); NamedNodeMap nnmInst = tmpNode.getAttributes(); doPrint(nnmInst); } } /** * doPrint * @param mapInst mapInst */ public void doPrint(Map mapInst) { for (Iterator iterator = mapInst.entrySet().iterator(); iterator.hasNext();) { Map.Entry entry = iterator.next(); System.out.println(entry); } } /** * 工具方法,打印 * @param nnm nnm */ public void doPrint(NamedNodeMap nnm) { int len = nnm.getLength(); for (int index = 0; index < len; index++) { Node tmpNode = nnm.item(index); System.out.println(tmpNode.getNodeName() + ":" + tmpNode.getNodeValue() + ":" + tmpNode.getNodeType()); } } /** * 测试入口 * @param args args */ public static void main(String[] args) { XMLParserTest xmlTest = new XMLParserTest(); // StringBuilder sbuilder = new StringBuilder(); // // sbuilder.append("<!--l version=/"1.0/" encoding=/"UTF-8/"-->"); // sbuilder.append(""); // sbuilder.append(""); // sbuilder.append(""); xmlTest.parserStr2XML(""); // xmlTest.parserXMLUsedDom(new File("C://12")); } /** * XML解析方式之SAX * @author WangYanCheng * @version 2010-5-7 */ class ParserXML4Sax extends DefaultHandler { /**rtnList*/ private List<map> rtnList = new ArrayList(); /** * rtnList * @return rtnList */ public List<map> getRtnList() { return rtnList; } /** * 文档读取开始<br /> * {@inheritDoc} */ public void startDocument() throws SAXException { super.startDocument(); } /** * 文档读取开始<br /> * {@inheritDoc} */ public void endDocument() throws SAXException { super.endDocument(); } /** * 读取元素开始<br /> * {@inheritDoc} */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); if ("ROOT".equals(qName)) { return; } Map tmpMap = new HashMap(); int attrLen = attributes.getLength(); for (int index = 0; index < attrLen; index++) { String key = null, value = null; key = attributes.getLocalName(index); value = attributes.getValue(index); tmpMap.put(key, value); } rtnList.add(tmpMap); System.out.println(rtnList.size()); } /** * 读取元素结束<br /> * {@inheritDoc} */ public void endElement(String uri, String localName, String qName) throws SAXException { super.endElement(uri, localName, qName); } } } |
需要用到的xml文件 <?xml version="1.0" encoding="utf-8"?> <ROOT> <SY_TASK LAST_DONE_TIME="1900-01-01 00:00:00" PK_CODE="1" /> <SY_TASK LAST_DONE_TIME="1900-01-01 00:00:00" PK_CODE="2" /> <SY_TASK LAST_DONE_TIME="1900-01-01 00:00:00" PK_CODE="3" /> <SY_TASK_VALUE PK_CODE="11" REF_TASK_PK="12" CHECK_VALUE="1" CHECK_TIME="2009-11-12 11:11:11"/> <SY_TASK_VALUE PK_CODE="12" REF_TASK_PK="12" CHECK_VALUE="2" CHECK_TIME="2009-11-13 11:11:11"/> <SY_TASK_VALUE PK_CODE="13" REF_TASK_PK="12" CHECK_VALUE="1" CHECK_TIME="2009-11-14 11:11:11"/> </ROOT> |
![]() ![]() |
|
小结:
·嵌套处理集合时可采封装的方式,这样便与代码维护,即便是出错了定位起来也比较容易。