`
canofy
  • 浏览: 829801 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

xml解析整理

    博客分类:
  • j2EE
阅读更多
这是自己整理的xml解析,参考了网上的例子:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <!--An XML Catalog-->
    <books title="XML Zone" publisher="IBM developerWorks">
        <book level="Intermediate" date="December-2001">
            <title>Java OO Book</title>
            <author>author</author>
        </book>
    </books>
</catalog>

1、jdom解析
package cn.xml;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

/**
 * yicha 
 * Dec 2, 2008 JDom解析
 */

public class JDomParse  {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws FileNotFoundException 
	 * @throws JDOMException 
	 */
	public static void main(String[] args) throws FileNotFoundException, IOException, JDOMException {
		String xmlpath="c:/catalog.xml";
		//使用JDOM首先要指定使用什么解析器
		SAXBuilder builder=new SAXBuilder(false);//这表示使用的是默认的解析器
		//得到Document,以后要进行的所有操作都是对这个Document操作的
		Document doc=builder.build(xmlpath);
		//得到根元素
		Element root=doc.getRootElement();
		//得到元素(节点)的集合
		List bookslist=root.getChildren("books");
		//轮循List集合
		for (Iterator iter = bookslist.iterator(); iter.hasNext();) {
		     Element books= (Element) iter.next();
		     List bookList=books.getChildren("book");
		     for(Iterator it=bookList.iterator();it.hasNext();){
		    	 Element book= (Element) it.next();
		    	 //取得元素的属性
			     String level=book.getAttributeValue("level");
			     System.out.println(level);
			     //取得元素的子元素(为最低层元素)的值  注意的是,必须确定book元素的名为“name”的子元素只有一个。
			     String author=book.getChildTextTrim("author");
			     System.out.println(author);		     
			     //改变元素(为最低层元素)的值;对Document的修改,并没有在实际的XML文档中进行修改
			     book.getChild("author").setText("author_test");
		     }
		     
		}
		//保存Document的修改到XML文件中
//		XMLOutputter outputter=new XMLOutputter();
//		outputter.output(doc,new FileOutputStream(xmlpath));

	}

}



dom解析:
package cn.xml;

import java.io.File;

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

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

/**
 * yicha 
 * Dec 1, 2008
 * DOM解析 
 */

public class DomPhase {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		long lasting =System.currentTimeMillis();
		try{
			File f=new File("c:/catalog.xml");
			DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
			DocumentBuilder builder=factory.newDocumentBuilder();
			Document doc = builder.parse(f);
			NodeList nl = doc.getElementsByTagName("author");
			for (int i=0;i<nl.getLength();i++){
				System.out.println("firstname:" + doc.getElementsByTagName("firstname").item(i).getFirstChild().getNodeValue());
				System.out.println(" lastname:" + doc.getElementsByTagName("lastname").item(i).getFirstChild().getNodeValue());
			}
		}catch(Exception e){
				e.printStackTrace();
		}
		System.out.println("运行时间:"+(System.currentTimeMillis() - lasting)+" 毫秒");
	} 
}

dom4j解析:
package cn.xml;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * yicha 
 * Dec 1, 2008 
 */

public class Dom4JPhase {
	
	/**
	 * 产生xml文档
	 */
	public void generateDocument(){ 
		  //使用 DocumentHelper 类创建一个文档实例。 DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类   
		   Document document = DocumentHelper.createDocument();   		      
		   //使用 addElement()方法创建根元素catalog , addElement()用于向 XML 文档中增加元素   
		   Element catalogElement = document.addElement("catalog");
		   //在 catalog 元素中使用 addComment() 方法添加注释"An XML catalog"   
		   catalogElement.addComment("An XML Catalog"); 
		   //在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令 (不知有什么用)  
//		   catalogElement.addProcessingInstruction("target","text");
		   //在 catalog 元素中使用 addElement() 方法增加 journal 节点   
		   Element booksElement = catalogElement.addElement("books");   
		   //使用 addAttribute() 方法向 book节点添加 title 和 publisher 属性   
		   booksElement.addAttribute("title", "XML Zone");   
		   booksElement.addAttribute("publisher", "IBM developerWorks");		   
		   //添加子节点
		   Element bookElement=booksElement.addElement("book");   
		   //添加属性   
		   bookElement.addAttribute("level", "Intermediate");   
		   bookElement.addAttribute("date", "December-2001"); 
		   //添加节点
		   Element titleElement=bookElement.addElement("title");  
		   //添加内容
		   titleElement.setText("Java OO Book");  
		   //添加节点
		   Element authorElement=bookElement.addElement("author");  
		   //添加节点
		   authorElement.setText("author");		      		      
		   //可以使用 addDocType() 方法添加文档类型说明   
		   //这样就向 XML 文档中增加文档类型说明:   
//		   document.addDocType("catalog","nikee","file://c:/Dtds/catalog.dtd");   
		   try{    
			   FileOutputStream fos=new FileOutputStream("c:/catalog.xml");   
		       OutputFormat of=new OutputFormat("    ", true);   
		       XMLWriter xw=new XMLWriter(fos, of);   
		       xw.write( document );   
		       xw.close();   
		   } catch(IOException e)    {   
		    System.out.println(e.getMessage());   
		   }   
	  }   
	  
	/**
	 * 读取xml文件的元素值
	 * @param list
	 */
	public void getXMLValue(List list){
//		List list=element.elements();
		if(list==null||list.size()==0){
			return;
		}
		for(int i=0;i<list.size();i++){
			 Element foo = (Element) list.get(i);
			 System.out.println(foo.getName()+"="+foo.getData().toString().trim());
			 List result=foo.elements();	
			 if(result!=null||result.size()>0){
				 this.getXMLValue(result);//递归
			 }
		}		
	}
	
	/**
	 * 根据节点名获取值
	 * @param fileName
	 * @param name
	 */
	public void getElement(String fileName,String name){
		Document document = this.readXML(fileName);
		Element root=this.getRootElement(document);
		// 枚举名称为name的节点
		for ( Iterator i = root.elementIterator(name); i.hasNext();) {
		    Element foo = (Element) i.next();
		    System.out.println(foo.getName()+"="+foo.getData());
		}
		// 枚举所有子节点
//	    for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
//	       Element foo = (Element) i.next();
//	       System.out.println(foo.getName()+"="+foo.getData());
//	    }
		
	}
	
	/**
	 * 根据节点名获取值
	 * @param fileName
	 * @param name
	 */
	public void getAttribute(Element element,String name){
		// 枚举属性
	    for ( Iterator i = element.attributeIterator(); i.hasNext(); ) {
	       Attribute attribute = (Attribute) i.next();
	       System.out.println(attribute.getName()+"="+attribute.getData());
	    }  
	}
	
	/**
	 * 得到root节点
	 * @param doc
	 * @return
	 */
	public Element getRootElement(Document doc){
	       return doc.getRootElement();
	}
	
	/**
	 * 读取xml文件
	 * @param fileName
	 * @return 返回document对象
	 */
	public Document readXML(String fileName){
		 SAXReader saxReader = new SAXReader();
		 Document document=null;
		  try {
			   document = saxReader.read(new File(fileName));
		  }catch(Exception e){
			  System.out.println("readXML has error:"+e.getMessage());
			  e.printStackTrace();
		  }
		  return document;
	}
	
	
	
	 /**
	  * 遍历整个XML文件,获取所有节点的值与其属性的值,并放入HashMap中
	  * @param 待遍历的XML文件
	  */
	 public void iterateWholeXML(String filename){	 
		  Document document = this.readXML(filename);
		  Element root=this.getRootElement(document);
		  List list=root.elements();
		  this.getXMLValue(list);	 
	 }
	 
	  public static void main(String[] argv){   
		  Dom4JPhase dom4j=new Dom4JPhase();   
		  dom4j.generateDocument();
		  String fileName="c:/catalog.xml";
		  String elementName="book";
//		  dom4j.generateDocument();
		  long lasting = System.currentTimeMillis();
		  dom4j.iterateWholeXML(fileName);
//		  dom4j.getElement(fileName, elementName);		  
		  System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + " 毫秒");		  
	  }  
}

rax解析:
package cn.xml;

/**
 * yicha 
 * Jul 3, 2008 
 */

import java.net.URL;
import java.util.Properties;

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;


/**
 * SAX 解析
 * @author yicha
 *
 */
public class SAXReader extends DefaultHandler {
	
	 /*props:用于存放解析器解析出来的的节点和节点对应的属性,为哈希表
     * currentName:当前节点的名称
     * currentValue:用于存放当前节点所对应的属性值
     */
    private Properties props;
    private String currentName;
    private StringBuffer currentValue = new StringBuffer();

   
    public SAXReader() {
        this.props=new Properties();
    }
 
 
    public Properties getPrpos() {
        return this.props;
    }
   
   
    public String getCurrentName(){
        return currentName;
    }
   
   
    /*
     * 读取<xxx>中的值xxx并将其付给qname,通知解析器解析当前节点对应的值。同时对currentValue缓冲器清空,用来保存当前qname对应属性值。
     * @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes)
     */
   public void startElement(String uri,String localName,String qName,Attributes attributes) throws SAXException{
        currentValue.delete(0,currentValue.length());
        this.currentName=qName;
    }
   
   
      /*读取<xxx></xxx>之间的属性值,并将其首先以字符形式保存至字符数组ch中,并记录对应长度,以确保以
       * length为长度的字符为一个整体,然后讲字符数组中的内容按照length长度为整体加到currentValue缓冲器中
       * 每次读取xml文件后只会在ch中保存当前所解析到的值,currentValue中也只会有当前的节点所对应的唯一值
     */
    public void characters(char[] ch,int start,int length)
    throws SAXException
    {
        currentValue.append(ch,start,length);
    }
	
    /* 当遇到</xxx>时,将当前的qname,和qname所对应的位于currentValue缓冲器中的值保存到props这个哈希表中去,供外部程序调用
     * @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String, java.lang.String, java.lang.String)
     */
    public void endElement(String uri, String localName, String qName)  throws SAXException   {
        props.put(qName.toLowerCase(), currentValue.toString().trim());
    }    
    
   
    
	public static void main(String args[]) {
		long lasting = System.currentTimeMillis();
		String fileName="c:/catalog.xml";
		SAXParserFactory sf = SAXParserFactory.newInstance();
		SAXParser sp;
		try {
			sp = sf.newSAXParser();	
			SAXReader reader = new SAXReader();
			sp.parse(new InputSource(fileName), reader);
		} 
		catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("运行时间:" + (System.currentTimeMillis() - lasting) + "毫秒");
	}
	
} 

package cn.xml;

import java.net.URL;
import java.util.Iterator;
import java.util.Properties;

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

/**
 * yicha 
 * Dec 1, 2008 
 */

public class SaxPhase {
	 private Properties props;	 
	 public SaxPhase(){
		 props=new Properties();
	 } 
	 
	 public Properties getProps(){
	        return this.props;
	 }	
	public  void parse(String filename)    throws Exception  {
	        //实例化解析器
			SAXReader handler = new SAXReader();	       
	        //实例化用于分析的工厂
	        SAXParserFactory factory = SAXParserFactory.newInstance();	       
	        //实例化分析类
	        SAXParser parser = factory.newSAXParser();	       
	        //得到xml文件对应的路径
	        URL confURL = SAXReader.class.getClassLoader().getResource(filename);
	        try{
	            parser.parse(confURL.toString(), handler);
	            props = handler.getPrpos();
	        }finally {         
	             //销毁已过期对象            
	            factory=null;
	            parser=null;
	            handler=null;
	        }
	        
	    }	    
	    /*
	     * 提供给外部程序调用的用于返回程序所对应需要的xml文件属性的方法
	     */
	 public String getElementValue(String elementName) {
	        //elementValue:对应于elementName的节点的属性值
	        String elementValue=null;
	        elementValue=props.getProperty(elementName);
	        return elementValue;
	 }
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		SaxPhase sp=new SaxPhase();
		String filename="testXML.xml";
		try {
			sp.parse(filename);
			Properties props=sp.getProps();
//			System.out.println(props.size()+"");
			Iterator it=props.keySet().iterator();
			while(it.hasNext()){
				String key=it.next().toString();
				System.out.println(props.get(key)+"");
			}
//			System.out.println(sp.getElementValue("driver-class"));
			
		} catch (Exception e) {		
			e.printStackTrace();
		}

	}

}
分享到:
评论

相关推荐

    windows平台XML解析工具

    Windows平台提供了多种XML解析工具,这些工具帮助开发者快速、高效地解析和查看XML文档,确保数据的准确性和完整性。本文将详细介绍Windows平台下的一款XML解析工具——foxe_CHS.exe,它是专为中文用户设计的版本。 ...

    xml文件解析网页资料整理

    Libxml2是 GNOME 项目的一个组件,是一个强大的、开源的XML解析库,支持多种XML相关的标准,如XPath、XInclude、XPointer、XML Schema和 Relax NG。 **XML的基本概念:** XML文件由一系列的元素构成,每个元素都有...

    SOAP xml解析

    SOAP解析,与一般的xml解析不一样,他中间存在报文,解析到就出错了,也就解析不下去,这里举了一个列子,(网络上找了好久都没找到我想要的列子,最后我自己根据例子做了整理做出来的),把数据组合成集合。...

    个人整理js解析XML文档

    到此我们知道了,当系统出现内存溢出时,是哪些参数设置不合理需要调整。但我们怎么知道服务器启动时,到底JVM内存相关参数的值是多少呢。 在实践中,经常遇到对JVM参数进行设置了,并且自己心里觉得应该不会出现...

    Android中解析XML

    昨两天偶然在csdn上学习到Android中解析XML,感觉博主写得清晰易懂,但是未有源码,于是自己整理了一下。学习参考:http://blog.csdn.net/liuhe688/article/details/6415593/

    三种xml解析

    这是一个关于xml解析的案例,主要介绍了dom4j,jdom,W3C的dom解析,以及dom4j,jdom的创建,还有各种解析的优缺点对比。我知道网上有很多博客,但是我这资源的好处是下载了直接就可以导入,连粘贴复制都省了。(如果你...

    Sax解析xml_动力节点Java学院整理

    SAX,全称为Simple API for XML,是一种基于事件驱动的XML解析器,相较于DOM解析,它具有更快的速度和更低的内存占用。DOM解析会将整个XML文档加载到内存中形成一个节点树,适合处理小规模或内存有限的情况。而SAX则...

    安卓调用WebService服务对返回的xml解析展示

    终于调通安卓调用Webservice,传参并解析XML的样例,使用工具:Android Studio和Eclipse.Eclipse启动WebServer,Android Studio进行Application编码调试。两个工程文件都在压缩包中。喜极而泣。。。

    VB解析XML|推荐代码

    VB解析XML应网友要求,重新整理了此源码,没有的抓紧下载啊,

    CMarkup源码 XML创建及解析

    简单实用的XML解析源码,开发的时候用到所以研究了下,现在分享出来给大家。 下载后取出里面的Markup.cpp和Markup.h,导入你的工程里面,CMarkup类就可以用了。其中的MSXML是另一套解析源码,主要使用COM,大家可以...

    java笔试题xml整理.doc

    Java XML 解析技术详解 XML(Extensible Markup Language)是一种标记语言,用于存储和传输数据。在 Java 中,有多种方式来解析 XML 文件,包括 DOM、SAX 和 StAX 等。在本文中,我们将详细介绍这些解析技术,并...

    xml基础实验整理搜集

    本实验整理集合了XML的基础知识,旨在帮助XML初学者快速入门并掌握其核心概念。 1. **XML的起源与特点** XML起源于HTML,但不同于HTML用于展示网页内容,XML设计的目标是传输和存储数据。它的特点是结构严谨、自我...

    java与xml 学习笔记整理

    XML文档对象模型(DOM)是一种广泛使用的解析XML的方式。DOM允许开发者通过Java代码与XML文档的结构进行交互,就像一棵树,每个元素、属性和文本都是树上的节点。 在Java中,DOM解析通常涉及以下步骤: 1. **创建...

    java四种xml解析实例和jar包,包括dom,sax,dom4j,jdom等方式

    java四种xml解析实例和jar包,包括dom,sax,dom4j,jdom等方式 java四种xml解析实例和jar包,包括dom,sax,dom4j,jdom...是学习Java的xml解析的好例子,包括相应的dom4j.jar,jdom.jar等,自己整理的,物超所值啊,奉献上了。

    Swing写的XML格式化工具XMLFormatter | #swing #xml

    - `XMLParser`:负责XML解析的类,可能根据所选解析器(DOM, SAX, StAX)实现不同方法。 - `Formatter`:处理XML格式化的类,执行添加缩进、换行等操作。 - 可能还有其他辅助类,如用于显示进度的`ProgressMonitor`...

    XML基础教程(自己整理的)

    五、XML解析 XML文档可以通过解析器读取和处理,分为DOM(Document Object Model)和SAX(Simple API for XML)两种主要方式: 1. DOM解析:一次性加载整个文档到内存,形成一个树形结构,方便遍历和修改。 2. SAX...

    算法、常用数据结构、文件资料、多线程和XML解析 资料汇总

    - **解析方式**:常见的 XML 解析方式包括 DOM(Document Object Model)、SAX(Simple API for XML) 和 StAX(Streaming API for XML)。 - **DOM 解析**:DOM 解析将整个 XML 文档加载到内存中,并提供一个树形...

    c#操作xml文件整理-绝对实用

    7. **事件驱动的XML解析** 对于大型或流式XML,可以使用`XmlReader`类。它是基于事件的,只在需要时读取数据,节省内存。 8. **XML文档验证** `XmlSchema`类可以帮助验证XML文档是否符合特定的XML模式(Schema)...

Global site tag (gtag.js) - Google Analytics