(4.1.30)XML解析之DOM、SAX
来源:互联网 发布:模糊预测算法 编辑:程序博客网 时间:2024/05/29 09:20
dom
/* * Copyright (C) 2009 Teleca Poland Sp. z o.o. <android@teleca.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.android.yunshi.util;import java.io.IOException;import java.io.StringReader;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import org.w3c.dom.Document;import org.xml.sax.InputSource;import org.xml.sax.SAXException;//xml的转换解析器/** * @author Lukasz Wisniewski */public class XMLUtil { /** * singleton */ private static DocumentBuilderFactory documentBuilderFactory = null; /** * DocumentBuilderFactory instance (lazy initialization) * * @return */ private static DocumentBuilderFactory getDocumentBuilderFactory(){ if(documentBuilderFactory == null){ documentBuilderFactory = DocumentBuilderFactory.newInstance(); } return documentBuilderFactory; } /** * DocumentBuilder instance * * @return */ private static DocumentBuilder getDocumentBuilder(){ try { return getDocumentBuilderFactory().newDocumentBuilder(); } catch (ParserConfigurationException e) { return null; } } /** * Converts String containing XML code to Document * * @param xmlString * @return <code>Document</code> interface */ public static Document stringToDocument(String xmlString){//字符串到xml的解析 if(xmlString == null) return null; DocumentBuilder documentBuilder = getDocumentBuilder(); InputSource inputSource = new InputSource(new StringReader(xmlString)); try { return documentBuilder.parse(inputSource); } catch (SAXException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } }}
package com.android.yunshi.fun;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import com.android.yunshi.util.XMLUtil;//解析运势字符串,并封装为实体类public class YunshiFunctions { private static Document document = null; private static Element root = null; public static Map<String, String> ResolveResultString(String xmlString, String rootstring) { // TODO Auto-generated method stub Map<String, String> entity = new HashMap(); NodeList nodes; int size; document = XMLUtil.stringToDocument(xmlString); if (document == null) { return null; } root = document.getDocumentElement(); nodes = root.getElementsByTagName(rootstring); Element TableName = (Element) nodes.item(0); nodes = TableName.getChildNodes(); size = nodes.getLength(); for (int i = 0; i < size; i++) { Node node = (Node) nodes.item(i); NodeList nodes2 = node.getChildNodes(); int size2 = nodes2.getLength(); for (int j = 0; j < size2; j++) { Node node2 = (Node) nodes2.item(j); if (node2.getNodeType() == Node.ELEMENT_NODE) { Element childNode = (Element) node2; entity.put(childNode.getNodeName(), childNode.getTextContent()); } } } return entity; } public static String ResolveResultStringToString(String xmlString, String rootstring) { // TODO Auto-generated method stub String entity; NodeList nodes; int size; document = XMLUtil.stringToDocument(xmlString); if (document == null) { return null; } root = document.getDocumentElement(); nodes = root.getChildNodes(); entity = nodes.item(0).getTextContent(); return entity; } public static List<Map<String, String>> ResolveResultStringToList( String xmlString, String rootstring) { List<Map<String, String>> list = new ArrayList<Map<String, String>>(); NodeList nodes; int size; document = XMLUtil.stringToDocument(xmlString); if (document == null) { return null; } root = document.getDocumentElement(); nodes = root.getElementsByTagName(rootstring); Element TableName = (Element) nodes.item(0); nodes = TableName.getChildNodes(); size = nodes.getLength(); for (int i = 0; i < size; i++) { Node node = (Node) nodes.item(i); NodeList nodes2 = node.getChildNodes(); int size2 = nodes2.getLength(); Map<String, String> entity = new HashMap(); for (int j = 0; j < size2; j++) { Node node2 = (Node) nodes2.item(j); if (node2.getNodeType() == Node.ELEMENT_NODE) { Element childNode = (Element) node2; entity.put(childNode.getNodeName(), childNode.getTextContent()); } } list.add(entity); } return list; }}
SAX
JAVA 解析 XML 通常有两种方式,DOM 和 SAX。即java中的JDK已经内置了SAX和DOM解析的相关包,因此这里不用导入第三方的jar包。 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。
下面是sax解析xml 的示例:
1、要解析的person.xml文件
2、获取服务器端xml文件输入流的工具类HttpUtil.java
public class HttpUtil{ public static InputStream getXML(String path) { InputStream in = null; try { URL url = new URL(path); if (url != null) { HttpURLConnection httpConn = (HttpURLConnection) url .openConnection(); httpConn.setConnectTimeout(3000); httpConn.setDoInput(true); httpConn.setRequestMethod("GET"); int code = httpConn.getResponseCode(); if (code == 200) { in = httpConn.getInputStream(); } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return in; }}
3.处理XML文件的核心类,该类一定要继承DefaultHandler 并覆盖相应的方法
package com.sax.handler;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.jar.Attributes.Name;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;public class MyHandler extends DefaultHandler { private HashMap map = null;// 存储单个解析的完整对象 private List> list = null;// 存储所有的解析对象 private String currentTag = null;// 正在解析的元素的标签 private String currentValue = null;// 解析当前元素的值 private String nodeName = null;// 解析当前的节点名称 public MyHandler(String nodeName) { // TODO Auto-generated constructor stub this.nodeName = nodeName; } public List> getList() { return list; } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub // 当读到第一个开始标签的时候,会触发这个方法 list = new ArrayList>(); } @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // 当遇到文档的开头的时候,调用这个方法 if (qName.equals(nodeName)) { map = new HashMap(); } if (attributes != null && map != null) { for (int i = 0; i < attributes.getLength(); i++) { map.put(attributes.getQName(i), attributes.getValue(i)); } } currentTag = qName; } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub // 这个方法是用来处理xml文件所读取到的内容 if (currentTag != null && map != null) { currentValue = new String(ch, start, length); if (currentValue != null && !currentValue.trim().equals("") && !currentValue.trim().equals("\n")) { map.put(currentTag, currentValue); } } currentTag = null;// 把当前的节点的对应的值和标签设置为空 currentValue = null; } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub // 遇到结束标记的时候,会调用这个方法 if (qName.equals(nodeName)) { list.add(map); map = null; } super.endElement(uri, localName, qName); }}
4、SAX解析的业务逻辑层
public class SaxService{ public SaxService() { // TODO Auto-generated constructor stub } public static List> readXML(InputStream in, String nodeName) { try {//获取SAx的实例工厂,并获取解析实例 SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); MyHandler handler = new MyHandler(nodeName); parser.parse(in, handler);// 开始解析XML文件 in.close(); return handler.getList(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; }}
5、测试类
public class TestSax{ public static void main(String[] args) { //要访问的xml文件的服务器地址 String url = "http://localhost:8081/jspchat/person.xml"; //获取服务器端xml文件的输入流 InputStream in = HttpUtil.getXML(url); //调用业务逻辑层访问xml文件中元素为person的的节点 List> list = SaxService.readXML(in, "person"); for (HashMap map : list) { System.out.println(map.toString()); } }}
0 0
- (4.1.30)XML解析之DOM、SAX
- java之XML解析(Dom及Sax)
- 安卓笔记之XML解析(DOM、SAX、PULL)
- Java 解析 xml 之 DOM and SAX
- Android之SAX解析dom的XML
- xml解析之dom,sax,pull
- xml之SAX,DOM,PULL解析
- dom,sax解析xml
- XML-DOM SAX解析
- xml解析,dom/sax
- XML解析之PULL解析+SAX解析+DOM解析
- XML解析(DOM SAX JDOM DOM4J)
- Java xml解析(DOM、SAX)
- Android-解析XML(Dom,Sax,Pull)
- Android解析xml(DOM SAX PULL)
- Java 解析XML文档(DOM & SAX)
- android 解析xml的三种方式(DOM,SAX,PULL)之SAX(转载收藏)
- XML解析之DOM解析和SAX解析
- SGU183 Painting the balls(DP+优化)
- JavaScript知识点总结-5
- JAVA使用JDBC连接数据库SQL Server2012
- Fragment销毁时replace和add两个方法的区别
- 智能穿戴——nRF51822开发总结
- (4.1.30)XML解析之DOM、SAX
- Android 监听来去电 弹出悬浮窗提示
- CSS学习笔记(3)
- 数据结构之---C语言实现最小生成树之kruskal(克鲁斯卡尔)算法
- JavaScript知识点总结--6
- Android手机开发总结——Android核心分析
- oauth2开放认证协议原理及案例分析
- SwitchyOmega和GoAgentX
- 手机号批量上传处理