Java解析操作XML文件详解

XML解析的两种方式:
DOM:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。
SAX:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。

dom4j是Java的XML API,用来读写XML文件的。目前有很多场景中使用dom4j来读写xml的。

DOM: 将整棵树一口气全部加载到内存当中, 我们可以非常方便的操作任意的标签和属性.,但是, 如果整棵树特别大的时候, 会出现内存溢出的问题
要使用dom4j开发,需要下载导入dom4j相应的jar文件。
官网下载:http://www.dom4j.org/dom4j-1.6.1/
github下载:http://dom4j.github.io/
下载解压之后如图所示:

我们只需要把dom4j-1.6.1.jar文件构建到我们开发项目中就可以了。


以Eclipse创建java项目的构建方法为例说明:

在demo项目中创建一个lib文件,把dom4j-1.6.1.jar文件拷贝到lib中,然后右键dom4j-1.6.1jar文件。点击Add to Bulid Path即可构建到项目中去了。src下添加/src/com/it/city.xml文件

 Dom4J的常用方法:

Document
   Element getRootElement() :获取根元素对象(根标签)
Element
   List elements() :获取所有的子元素
   List elements(String name):根据指定的元素名称来获取相应的所有的子元素
   Element element(String name):根据指定的元素名称来获取子元素对象,如果元素名称重复,则获取第一个元素 
   String    elementText(String name) :根据指定的子元素名称,来获取子元素中的文本
   String    getText() :获取当前元素对象的文本
   void setText(String text):设置当前元素对象的文本
   String    attributeValue(String name):根据指定的属性名称获取其对应的值
   public Element addAttribute(String name,String value):根据指定的属性名称和值进行添加或者修改

 city.xml

<?xml version="1.0" encoding="UTF-8"?>

<State Code="37" Name="河南" 
    description="郑州" GDP="99999亿"> 
  <City> 
    <Name>郑州</Name>  
    <Region>高薪区</Region> 
  </City>  
  <City>三门峡</City>  
  <City>洛阳</City>  
  <City>安阳</City>  
  <City>南阳</City> 
</State>

  代码操作示例:

package vrv.com;

import java.io.File;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Tt {

	// 加载xml文件,获取dom对象
	public static Document getDocument() throws Exception {
		SAXReader reader = new SAXReader();
		Document document = reader.read(new File("./src/com/it/city.xml"));
		return document;
	}

	// 1.遍历所有元素节点:打印他们的元素名称。 Ps: 因为不知道有多少个元素节点, 所以需要递归.
	private static void method1(){
		        Document document =getDocument();
		        Element rootElement = document.getRootElement();
		        treeWalk(rootElement);
		    }      
	   
	// 输出节点下所有元素名
	public static void treeWalk(Element element) {
		        //输出元素的名称
		        System.out.println(element.getName());
		        
		        //获取指定元素的所有子元素
		        List<Element> es = element.elements();
		        for (Element e : es) {
		            treeWalk(e);
		        }
		    }

	// 2.得到某个具体的节点内容:打印"郑州"
	private static void method2() {
		      
		        Document document = getDocument(); 
		        //获取根元素
		        Element rootElement = document.getRootElement();
		        //获取根元素下的所有子元素
		        List<Element> elements = rootElement.elements();
		        //根据索引获取第一个City元素
		        Element cityElement = elements.get(0);
		        //根据子元素的名称来获取子元素的文本
		        String text = cityElement.elementText("Name");
		        System.out.println(text);
		    }
	
	
	//3、修改某个元素节点的主体内容:信阳-->安阳
	private static void method3() throws Exception, IOException {
		        Document document =getDocument();
		        //获取根元素
		        Element rootElement = document.getRootElement();
		        //获取根元素下的所有子元素
		        List<Element> es = rootElement.elements();
		        //根据索引可以获取指定的元素
		        Element cityElement = es.get(3);
		        //修改文本
		        cityElement.setText("安阳");
		        //写回文件
		        write2XML(document);
		    }
	
	public static void write2XML(Document document) throws IOException {
		        OutputFormat format = OutputFormat.createPrettyPrint();
		        //format.setEncoding("UTF-8");//默认的编码就是UTF-8
		        XMLWriter writer = new XMLWriter( new FileOutputStream("src/com/it/city.xml"), format );
		        writer.write( document );
		    }
	
	//4、删除指定元素节点:删除元素开封    
	private static void method4() throws Exception, IOException {
		        Document document =getDocument();
		        //获取根元素
		        Element rootElement = document.getRootElement();
		        //获取根元素下的所有子元素
		        List<Element> es = rootElement.elements();
		        Element cityElement = es.get(1);
		        //无法自杀,找他爹
		        Element parentElement = cityElement.getParent();
		        parentElement.remove(cityElement);
		        //写回文件
		        write2XML(document);
		    }
	
	//5、向指定元素节点中增加子元素节:添加一个新城市<City>南阳</City>
	private static void method5() throws Exception, IOException {
		        Document document =getDocument();
		        //获取根元素
		        Element rootElement = document.getRootElement();
		        //添加元素
		        Element cityElement = rootElement.addElement("City");
		        //设置文本
		        cityElement.setText("南阳");
		        //写回文件
		        write2XML(document);
		}

	   //6、向指定元素节点上增加同级元素节点:在洛阳前面,添加一个<City>三门峡</City>
		private static void method6() throws Exception, IOException {
		        //创建一个新的元素对象
		        Element cityElement = DocumentHelper.createElement("City");
		        //设置文本
		        cityElement.setText("三门峡");
		        
		        Document document =getDocument();
		        //获取根元素
		        Element rootElement = document.getRootElement();
		        //获取根元素下所有的子元素
		        List<Element> es = rootElement.elements();
		        //将新的元素添加到子元素列表中
		        es.add(1, cityElement);
		        
		        //写会文件
		        write2XML(document);
		}
	
	//7、操作XML文件属性:打印State的Name
	private static void method7() throws Exception {
		        Document document =getDocument();
		        //获取根元素
		        Element rootElement = document.getRootElement();
		        //根据属性名称获取值
		        String value = rootElement.attributeValue("Name");
		        System.out.println(value);
		}

	   //8、添加属性:State: GDP="99999亿"
		public static void method8() throws Exception  {
		        Document document = getDocument();
		        //获取根元素
		        Element rootElement = document.getRootElement();
		        //添加新的属性和对应的值
		        rootElement.addAttribute("GDP", "99999亿");
		        
		        //写回文件
		        write2XML(document);
		}


}

   

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值