`
wandejun1012
  • 浏览: 2732699 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

xml解析方法

    博客分类:
  • xml
阅读更多

xml文件如下:

 

 

 

<?xml version="1.0" encoding="UTF-8"?>
<articles>
	<article category="xml">
		<title>xml概述</title>
		<author>janet</author>
		<email>janetvsfei@yahoo.com.cn</email>
		<date>20080801</date>
	</article>
	<article category="java">
		<title>Java基本语法</title>
		<author>janet</author>
		<email>janetvsfei@yahoo.com.cn</email>
		<date>20080802</date>
	</article>
</articles>

 

 注意:xml文件的顶部<?xml version="1.0" encoding="UTF-8"?>这句话之前不能有任何空格,空行之类的,否则会出错。

 

 

1、用纯DOM来做。

用Element root=document.getDocumentElement()拿到根后,然后不停的遍历即可。

DOM的特点是将XML映射成一个Document,是一次性将所有XML全部载入到内存中。

例子如下:

 

 

 

package testXmlParse.dom;

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;


public class TestXml_DOM {

	public static void main(String[] args) {

		File file=new File("D:\\temp\\Bosch\\articles.xml");
		
		DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
		
		try {
			DocumentBuilder db= dbf.newDocumentBuilder();
			
			Document document=db.parse(file);//开始解析文件
			
			//下面拿到根
			Element root=document.getDocumentElement();
			
			System.out.println(root.getNodeName());
			
			//开始遍历根下面的子结点
			NodeList nodeList=root.getChildNodes();
			
			for(int i=0;i<nodeList.getLength();i++){
				Node node=nodeList.item(i);
				
				if("article".equals(node.getNodeName())){
					//打印书的分类名称
					System.out.println("\r\n找到一本新书,书的分类是:"+node.getAttributes().getNamedItem("category").getNodeValue()+".");
					//取得article下面的所有子结点
					NodeList childNodeList=node.getChildNodes();
					//遍历article
					for(int j=0;j<childNodeList.getLength();j++){
						//拿到article下面的每一个item
						Node childNode=childNodeList.item(j);
						if("title".equals(childNode.getNodeName())){
							System.out.println("title:"+childNode.getTextContent());
						}else if("author".equals(childNode.getNodeName())){
							System.out.println("author:"+childNode.getTextContent());
						}else if("email".equals(childNode.getNodeName())){
							System.out.println("email:"+childNode.getTextContent());
						}else if("date".equals(childNode.getNodeName())){
							System.out.println("date:"+childNode.getTextContent());
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

 

 

2、用SAX来做:

比纯DOM方便,快的多,是只把需要的载入内存中,不像DOM那样全部载入内存。

缺点是只能以File为载体,单纯的String好像不能解析,研究中……

 

 

package testXmlParse.sax;

import java.io.File;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

public class XmlParse {

	public static void main(String[] args) {
		
		File xmlFile=new File("d:/temp/Bosch/onhand.xml");
		SAXParserFactory factory=SAXParserFactory.newInstance();
		try {
			SAXParser parser=factory.newSAXParser();
			parser.parse(xmlFile,  new MySaxHandler());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

 

 

 

package testXmlParse.sax;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class MySaxHandler extends DefaultHandler {
	static DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	private String content;

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		content = new String(ch, start, length);
	}

	@Override
	public void endElement(String uri, String localName, String name)
			throws SAXException {
		if ("title".equals(name)) {
			System.out.println("标题:" + content);
		} else if ("author".equals(name)) {
			System.out.println("作者:" + content);
		} else if ("email".equals(name)) {
			System.out.println("电子邮件:" + content);
		} else if ("body".equals(name)) {
			System.out.println("内容:" + content);
		} else if ("date".equals(name)) {
			System.out.println("发表日期:" + content);
		}
	}

	@Override
	public void startElement(String uri, String localName, String name,
			Attributes attributes) throws SAXException {
		if ("article".equals(name)) {
			System.out.println("\r\n找到一篇文章,所属分类:" 
					+ attributes.getValue("category")+". ");
		}
	}

}

 

 

3、DOM4J

 

 

package testXmlParse.dom4j;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Element;


/**
 * @autor germmy
 * @date 2012-12-11
 * @version
 */
@SuppressWarnings("unchecked")
public class XmlUtil {
	protected static Logger logger = Logger.getLogger(Dom4jParser.class);

	public static final String[]NODENAMES={"title","author","email","date"};
	
	/**
	 * 采用指定的编码读取XML
	 * 
	 * @param fileName
	 * @return
	 */
	public static String readFile_encoding(String fileName) {

		String encoding = "UTF-8"; // 字符编码
		File file = new File(fileName);

		BufferedReader reader = null;
		StringBuffer sb = new StringBuffer("");
		try {
			// reader = new BufferedReader(new FileReader(file));
			InputStreamReader read = new InputStreamReader(new FileInputStream(
					file), encoding);
			reader = new BufferedReader(read);
			String tempString = null;
			int line = 1;
			while ((tempString = reader.readLine()) != null) {
				sb.append(tempString);
				line++;
			}
			reader.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
				}
			}
		}
		return sb.toString();
	}
	
	public static List getOrderInfoList(String xml){
		List list=new ArrayList();
		Map map=new HashMap();
		try {
			List articles = Dom4jParser.getElements(xml,"article");// 所有的Item节点
			if(articles!=null){
				logger.debug("article.length["+articles.size()+"]");
				for (int i = 0; i < articles.size(); i++) {
					map=new HashMap();
					list.add(map);
					Element element = (Element) articles.get(i);
					for(int j=0;j<NODENAMES.length;j++){
						Dom4jParser.parseText(map,element,NODENAMES[j]);
					}
				}
			}
		} catch (Exception e) {
			list=null;
			logger.error("",e);
		}
		return list;
	}
	
	public static void main(String[] args) {
		String xml=readFile_encoding("d:/temp/Bosch/articles.xml");
		XmlUtil.getOrderInfoList(xml);
		//getOrders(ConfigUtil.testXml);
	}
}

 

 

 

package testXmlParse.dom4j;

import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

/**
 * @autor germmy
 * @date 2012-12-11
 * @version
 */
@SuppressWarnings("unchecked")
public class Dom4jParser {
	protected static Logger logger = Logger.getLogger(Dom4jParser.class);
	public static Document getDom4JDocument(String xml){
		Document doc = null;
		try {
			doc = DocumentHelper.parseText(xml);
		} catch (DocumentException e) {
			logger.error("",e);
		}
		return doc;
	}
	public static Element getRoot(String xml){
		Document doc=getDom4JDocument(xml);
		if(doc!=null){
			Element root = doc.getRootElement();// 指向根节点
			return root;
		}else{
			return null;
		}
	}
	public static List getElements(String xml,String nodeName){
		Document doc=getDom4JDocument(xml);
		List elements=null;
		if(doc!=null){
			Element root = doc.getRootElement();// 指向根节点
			if(root!=null){
				elements = root.elements(nodeName);// 所有的Item节点
			}
		}
		if(elements==null){
			logger.debug("can't find elements["+nodeName+"] in xml");
		}
		return elements;
	}
	
	
	public static void parseText(Map map,Element element,String nodeName){
		Element e=element.element(nodeName);
		if(e!=null){
			System.out.println("nodeName:"+nodeName);
			System.out.println("value:"+e.getTextTrim());
			map.put(nodeName, e.getTextTrim());
		}else{
			logger.debug("can't find Element["+nodeName+"] in xml");
		}
	}
}

 

 

4、SAXReader,以前写过,待整理。

 

refurl:http://developer.51cto.com/art/200903/117512.htm xml解析的4个方法

分享到:
评论
1 楼 panjianshui 2012-12-11  
[b][/b]
引用

相关推荐

    比较通用的xml解析方法

    本篇文章将详细探讨一种比较通用的XML解析方法,适用于各种编程环境。 在处理XML文件时,我们通常会遇到两种主要的解析方式:DOM(Document Object Model)和SAX(Simple API for XML)。DOM将整个XML文档加载到...

    安卓网站交互JSONxmlWebserviceUPnP相关-比较通用的xml解析方法.rar

    本压缩包文件"安卓网站交互JSONxmlWebserviceUPnP相关-比较通用的xml解析方法.rar"主要关注XML解析方法,虽然未提及具体的所有内容,但我们可以根据标签和描述来探讨这些关键知识点。 首先,让我们深入了解一下JSON...

    比较通用的xml解析方法.zip

    这个压缩包“比较通用的xml解析方法.zip”包含了一些与XML解析相关的资源,如库文件和源码示例,让我们逐一探讨。 1. **DOM4J.jar**: DOM4J 是一个灵活的 Java XML API,它提供了全面的功能,包括文档对象模型...

    安卓Android源码——比较通用的xml解析方法.rar

    本资料包“安卓Android源码——比较通用的xml解析方法”将深入探讨在Android平台上解析XML的多种方法。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,便于遍历和...

    多种xml解析方法以及各自的优点

    本文将深入探讨三种主要的XML解析方法:DOM解析、SAX解析和DOM4J解析,并分析它们各自的特点和优势。 1. DOM解析(Document Object Model) DOM解析器将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。...

    易语言 xml解析 易语言 xml解析 教程 带源码

    7. **实际应用**:了解了基本的XML解析方法后,我们可以将其应用到实际项目中,比如读取配置文件、从网络获取XML数据、存储游戏数据等。 8. **源码分析**:教程中提供的源码是学习易语言XML解析的重要资源。通过...

    应用源码之比较通用的xml解析方法.zip

    本资料包“应用源码之比较通用的xml解析方法”专注于讲解如何在Android环境中解析XML文件,这对于理解和优化应用程序的性能至关重要。下面我们将深入探讨XML解析的几种方法及其优缺点。 1. DOM解析器(Document ...

    Android应用源码之比较通用的xml解析方法.zip

    Android提供了两种主要的XML解析方法:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。 1. DOM解析: DOM解析器将整个XML文档加载到内存中,形成一个树形结构。开发者可以通过这个树形结构轻松...

    比较通用的xml解析方法_android源码.zip

    本资料“比较通用的xml解析方法”探讨了在Android中解析XML的几种常见方法。 1. DOM解析器: DOM(Document Object Model)是XML文档的树形结构表示。它一次性加载整个XML文档到内存中,形成一个完整的树形结构,...

    4种解析XML方法实例

    本教程将详细介绍四种常见的XML解析方法,以帮助你更好地理解和处理XML数据。 1. DOM解析器(Document Object Model) DOM解析器将整个XML文档加载到内存中,创建一个树形结构,允许开发者通过节点操作来访问和修改...

    3种xml解析方法

    本文将深入探讨三种XML解析方法:JAXB(Java Architecture for XML Binding)、DOM4J以及DOM(Document Object Model)。 首先,JAXB是Java平台标准的一部分,它提供了一种将Java对象绑定到XML的机制,使得数据交换...

    比较通用的xml解析方法.zip项目安卓应用源码下载

    本项目"比较通用的xml解析方法.zip"提供了一个安卓应用的源码,主要关注XML在Android环境下的解析方法。下面我们将深入探讨XML解析在Android中的重要性以及几种常见的解析方式。 XML解析是Android开发中必不可少的...

    安卓Android源码——比较通用的xml解析方法.zip

    本资源“安卓Android源码——比较通用的xml解析方法.zip”显然聚焦于探讨在Android平台上解析XML的不同方法。这里我们将深入探讨两种主要的XML解析技术:SAX(Simple API for XML)和DOM(Document Object Model),...

    Android 比较通用的xml解析方法-IT计算机-毕业设计.zip

    本示例着重于Android中的两种主要XML解析方法:DOM(Document Object Model)解析和SAX(Simple API for XML)解析。这两种方法各有优缺点,适用于不同的场景。 首先,DOM解析是最常见的方法之一。它将整个XML文档...

    Android高级应用源码-比较通用的xml解析方法.zip

    本资料"Android高级应用源码-比较通用的xml解析方法.zip"包含了关于XML解析的一些通用实现,旨在帮助开发者理解和掌握Android中处理XML的多种方法。以下是对这些知识点的详细解释: 1. DOM解析: Document Object ...

Global site tag (gtag.js) - Google Analytics