Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】

文章来源:http://www.jb51.net/article/46893.htm

1、基础知识:
Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。

2、使用介绍
1)、DOM
(1)简介

由W3C(org.w3c.dom)提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。优点就是整个文档都一直在内存中,我们可以随时访问任何节点,并且对树的遍历也是比较熟悉的操作;缺点则是耗内存,并且必须等到所有的文档都读入内存才能进行处理。

XML文档示例:

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <TelePhone>
    <type name="nokia">
      <price>599</price>
      <operator>CMCC</operator>
    </type>
    <type name="xiaomi">
      <price>699</price>
      <operator>ChinaNet</operator>
    </type>
  </TelePhone>
</root>

 

省略......

(3)元素(Element)和结点(Node)的区别(org.w3c.dom)
Node对象是整个文档对象模型的主要数据类型,是DOM中最基本的对象,代表了文档树中的抽象节点。但在实际使用中很少会直接使用Node对象,而是使用Node对象的子对象Element,Attr,Text等。
Element对象表示HTML或XML文档中的一个元素,是Node类最主要的子对象,在元素中可以包含属性,因而Element中有存取其属性的方法。
Element是从Node继承而来的,元素是一个小范围的定义,必须是含有完整信息的结点才是一个元素,例如<div>...</div>。但是一个结点不一定是一个元素,而一个元素一定是一个结点。
node有几个子类型:Element,Text,Attribute,RootElement,Comment,Namespace等

2)、SAX


3)、JDOM(jdom.jar)

src目录下的identity.xml文件结构:

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <person id="1">
  <username>张三</username>
  <password>123123</password>
 </person>
 <person id="2">
  <username>1111111112</username>
  <password>password2</password>
 </person>
</root>

示例代码:

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
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;


public class testjj {
	//XML文件放在src目录下
	//解析XML文件
	private static void parseXml() throws JDOMException, IOException {
		SAXBuilder sb=new SAXBuilder();
//		File file=new File("");
		InputStream is=testjj.class.getResourceAsStream("/identity.xml");//建议写法
		
		Document doc=sb.build(is);//获得文档对象
		Element root=doc.getRootElement();//获得根节点
		List<Element> list=root.getChildren();
		for(Element e:list){
			System.out.println("ID="+e.getAttributeValue("id"));
			System.out.println("username="+e.getChildText("username"));
			System.out.println("password="+e.getChildText("password"));
		}
	}
	
	 //增
	 public static void addXml() throws JDOMException, FileNotFoundException, IOException {
	  SAXBuilder builder = new SAXBuilder();
	  InputStream is=testjj.class.getResourceAsStream("/identity.xml");//建议写法
	  
	  Document doc = builder.build(is);//获得文档对象
	  Element root = doc.getRootElement();//获得根节点
	  //添加新元素
	  Element element = new Element("person");
	  element.setAttribute("id", "3");
	  Element element1 = new Element("username");
	  element1.setText("zhangdaihao");
	  Element element2 = new Element("password");
	  element2.setText("mima");
	  element.addContent(element1);
	  element.addContent(element2);
	  root.addContent(element);
	  doc.setRootElement(root);
	  
	  //文件处理
	  XMLOutputter out = new XMLOutputter();
	  out.output(doc, new FileOutputStream("src/identity.xml"));
	 }
	 
	 //根据ID值删除一个节点
	 public static void deletePerson(int id) throws JDOMException, IOException {
	  SAXBuilder builder = new SAXBuilder();
	  InputStream is=testjj.class.getResourceAsStream("/identity.xml");
	  
	  Document doc = builder.build(is);//获得文档对象
	  Element root = doc.getRootElement();//获得根节点
	  List<Element> list = root.getChildren();
	  for(Element e:list) {
	   //获取ID值
	   if(Integer.parseInt(e.getAttributeValue("id"))==id) {
	    root.removeContent(e);
	    break;//??
	   }
	  }
	  
	  //文件处理
	  XMLOutputter out = new XMLOutputter();
	  out.output(doc, new FileOutputStream("src/identity.xml"));
	 }
	 
	//根据ID值修改一个节点
	 public static void updatePerson(int id) throws JDOMException, IOException {
	  SAXBuilder builder = new SAXBuilder();
	  InputStream is=testjj.class.getResourceAsStream("/identity.xml");
	  Document doc = builder.build(is);//获得文档对象
	  Element root = doc.getRootElement();//获得根节点
	  
	  List<Element> list = root.getChildren();
	  for(Element e:list) {
	   //获取ID值
	   if(Integer.parseInt(e.getAttributeValue("id"))==id) {
	    System.out.println("--------------------");
	    e.getChild("username").setText("111111111");
	    e.getChild("password").setText("password");
	    
	   }
	  }
	  
	  //文件处理
	  XMLOutputter out = new XMLOutputter();
	  out.output(doc, new FileOutputStream("src/identity.xml"));
	 }
	 
	public static void main(String[] args) {
		try {
//			addXml();
			//deletePerson(3);
			updatePerson(3);
			parseXml();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}


4)、DOM4J(dom4j.jar)
(1)简介
dom4j是目前在xml解析方面是最优秀的(Hibernate、Sun的JAXM也都使用dom4j来解析XML),它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。
在使用XPATH时要增加jaxen.jar,否则会出现如下错误:

代码如下:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/JaxenException
at org.dom4j.DocumentFactory.createXPath(DocumentFactory.java:230)
at org.dom4j.tree.AbstractNode.createXPath(AbstractNode.java:207)      
at org.dom4j.tree.AbstractNode.selectNodes(AbstractNode.java:164)

(2)示例代码:

package nc.util;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;

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;
import org.junit.Test;
import org.xml.sax.InputSource;

public class XMLHandler {
	public XMLHandler(){
	}
	@Test
	public String createXML(){
		String strXML=null;
		//
		Document document=DocumentHelper.createDocument();
		Element root=document.addElement("root");
		Element phone=root.addElement("TelePhone");
		
		Element nokia=phone.addElement("type");
		nokia.addAttribute("name", "nokia");
		Element price_nokia=nokia.addElement("price");
		price_nokia.addText("599");
		Element operator_nokia=nokia.addElement("operator");
		operator_nokia.addText("CMCC");
		
		Element xiaomi=phone.addElement("type");
		xiaomi.addAttribute("name","xiaomi");
		Element price_xiaomi=xiaomi.addElement("price");
		price_xiaomi.addText("699");
		Element operator_xiaomi=xiaomi.addElement("operator");
		operator_xiaomi.addText("ChinaNet");
		
		//核心为document  XMLWriter
		
		StringWriter strWriter=new StringWriter();
		OutputFormat format=OutputFormat.createPrettyPrint();
		format.setEncoding("utf-8");
		//作用:构建XML文件结构,写到StringWriter?
		XMLWriter xmlWriter=new XMLWriter(strWriter, format);
		try {
			xmlWriter.write(document);
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		strXML=strWriter.toString();
System.out.println("strxml===="+strXML);		
		//strXML=document.asXML();
//System.err.println("document===="+strXML);	
		

		//输出
		File file=new File("telephone.xml");
		if(file.exists()){
			file.delete();
		}
		
		try {
			file.createNewFile();
			XMLWriter out=new XMLWriter(new FileWriter(file));
			out.write(document);
			out.flush();
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return strXML;
	}
	/**
	 * 解析XML格式的字符串
	 */
	private  void parserXML(String strXML) {
		SAXReader reader=new SAXReader();
		
		StringReader strReader=new StringReader(strXML);
		InputSource source=new InputSource(strReader);
		try {
			Document document=reader.read(source);
//System.out.println(document.asXML());
			Element root=document.getRootElement();
			//get element    方法elements("节点标识");获取属性值element.attributeValue("节点标识")
			List<Element> phoneList=root.elements("TelePhone");
			List<Element> typeList=phoneList.get(0).elements("type");
			for(int i=0;i<typeList.size();i++){
				Element element=typeList.get(i);
				String phoneName=element.attributeValue("name");
				System.out.println("phoneName:"+phoneName);
				//get all element  方法element()
				List<Element> childList=element.elements();
				for(Element e:childList){
					System.out.println(e.getText());
				}
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	
         /** * 解析XML格式的字符串 */	
	private  void parseXMLbyXPath(String strXML) {
		SAXReader reader = new SAXReader();
		
		StringReader strReader=new StringReader(strXML);
		InputSource source=new InputSource(strReader);
		
		try {
			Document document=reader.read(source);
			List<Element> list=document.selectNodes("/root/TelePhone/type");
			for(int i=0;i<list.size();i++){
				Element element=list.get(i);
System.out.println(element.attributeValue("name"));		
				
				List list1 = element.selectNodes("./*");
				for(int j=0;j<list1.size();j++){
				    Element e1 = (Element) list1.get(j);
System.out.println(e1.getName()+"="+e1.getText());
				}

			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
	
	
	public static void main(String [] args){
		XMLHandler handler=new XMLHandler();
		String strXML=handler.createXML();
		
		//handler.parserXML(strXML);
		
		handler.parseXMLbyXPath(strXML);
		
	}
}

5)XPATH
(1)简介
XPath是一门在XML文档中查找信息的语言。XPath用于在XML文档中通过元素和属性进行导航。
具体语法介绍参考:http://w3school.com.cn/xpath/index.asp

省略......

上一篇:java使用ftp上传文件示例分享

下一篇:Java 读取文件方法大全

 

 

 

 

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值