`

xml解析

阅读更多

                                                               XML有三种解析方式

      1.Sax解析

      2.Pull解析

      3.Dom解析

   解析的xml

   

<?xml version="1.0" encoding="UTF-8"?>
<Persons>
 <Person id="1">
  <name>再_见孙悟空</name>
  <age>19</age>
 </Person>

 <Person id="2">
  <name>AMB</name>
  <age>19</age>
 </Person>
</Persons>

 

第一种解析Sax解析

   

/**
 * 以事件的形式通知程序,对xml进行解析
 * 
 * @author tanlvxu
 * 
 */
public class Sax_Demo extends DefaultHandler {
	// 存储单个解析的完整对象
	private HashMap<String, String> map = null;
	// 存储所以对象
	private List<HashMap<String, String>> list = null;
	// 正在解析的元素
	private String currentTag = null;
	// 解析当前元素的值
	private String currentValue = null;
	// 解析当前节点的名称
	private String nodeName = null;

	public Sax_Demo(String nodeName) {
		this.nodeName = nodeName;
	}

	public List<HashMap<String, String>> getList() {
		return list;
	}
	/**
	 * 接收文档开始的通知
	 */
	@Override
	public void startDocument() throws SAXException {
		// TODO Auto-generated method stub
		list = new ArrayList<HashMap<String,String>>() ;
	}

	/**
	 * 接收元素开始的通知。
	 * uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
     * localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
     * qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
     * attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。 
	 */
	@Override
	public void startElement(String url, String localName, String qName,
			Attributes attributes) throws SAXException {
		// TODO Auto-generated method stub
		if(qName.equals(nodeName)){
			map = new HashMap<String, String>() ;
		}
		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
		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 url, String localName, String qName)
			throws SAXException {
		// TODO Auto-generated method stub
		if(qName.equals(nodeName)){
			list.add(map) ;
			map = null ;
		}
	}
}

  

  通过URL取得InputStream对象

   

public static InputStream getXML(String path){
		InputStream inputStream = null ;
		try {
			URL url = new URL(path);
			if(url != null){
				
				HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection() ;
			    httpURLConnection.setConnectTimeout(3000) ;
			    httpURLConnection.setDoInput(true) ;
			    httpURLConnection.setRequestMethod("GET") ;
			    int code = httpURLConnection.getResponseCode() ;
			    if(code==HttpURLConnection.HTTP_OK){
			    	System.out.println("连接正常!!");
			    	inputStream = httpURLConnection.getInputStream() ;
			    }
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return inputStream ;
	}

 通过解析inputstream,返回List集合

   

public static List<HashMap<String,String>> getList(InputStream inputStream,String nodeName){		
		try {
			//创建一个解析xml的工厂对象
			SAXParserFactory spf = SAXParserFactory.newInstance() ;
			SAXParser saxParser = spf.newSAXParser() ;
			Sax_Demo sDemo = new Sax_Demo(nodeName) ;
			saxParser.parse(inputStream,sDemo) ;
			inputStream.close() ;
			return sDemo.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 ;
	}

 三种解析原理其实大致相同,只是在实现上有所不同.下面两种就不写了,直接上源码

 下面两种方法解析的xml为

    

<Games>
 <Game id="1">
  <name>英雄联盟</name>
  <English_Name>LEAGUEofLEGED</English_Name>
 </Game>
 
  <Game id="2">
  <name>刀塔</name>
  <English_Name>DOTA</English_Name>
 </Game>
</Games>

 

  • Xml_Done.rar (53.6 KB)
  • 描述: 三种xml解析方法
  • 下载次数: 0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics