码迷,mamicode.com
首页 > 其他好文 > 详细

Dom4j解析XML

时间:2015-03-07 15:44:09      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:dom4j   xml解析   xml   

dom4j解析:(功能强大,容易使用。需要dom4j的jar包)
		结合文档开发。
		XPath提取xml文档信息
		XPath语法:
			<AAA>
				<BBB id="b1">
					<CCC>
					</CCC>
					<DDD>
					</DDD>
					<EEE>
					</EEE>
				</BBB>
				<BBB name="bbb">
					<CCC>
					</CCC>
					<DDD>
					</DDD>
					<EEE>
					</EEE>
				</BBB>
				<BBB id="b2">
					<CCC>
					</CCC>
				</BBB>
			</AAA>
		
			//BBB/CCC:(相对节点BBB,遍历所有的父类节点是BBB下的CCC节点)
			/AAA/BBB/CCC:从根节点开始遍历(AAA必须为根)
			/AAA/BBB/*:提取根节点AAA下的第一个BBB节点下的所有节点
			/*/*/CCC:提取有2个父节点的CCC节点
			//*:提取所有节点
			/AAA/BBB[1]:提取AAA节点下的第一个BBB节点
			/AAA/BBB[last()]:提取AAA节点下的最后一个BBB节点
			//@id:选择所有的有id属性的元素(节点)
			//BBB[@id]:选择所有有id属性的BBB元素
			//BBB[@name]:选择所有有name属性的BBB元素
			//BBB[@*]:选择所有有任意属性的BBB元素
			//BBB[not(@*)]:选择所有没有属性的BBB元素
			//BBB[@id="b1"]:提取出id值等于b1的BBB元素
			//BBB[@name="bbb"]:提取出name值等于bbb的BBB元素
			//BBB[normalize-space(@name)="bbb"]:选择含有name属性,通过normalize-space()函数去掉空格后等于bbb的元素
			//*[count(BBB)=2]:选择含有2个BBB节点的元素
			//*[count(*)=2]:选择含有2个子元素的元素
			//*[name()="BBB"]:提取所有名称为BBB的标签的元素
			可用or,and连接以上条件
			...........
			结合文档
			...........
			
XML Schema:一种xml文档结构与内容的模式语言,为了克服DTD的局限性(取代DTD)(模式文档=约束文档。遵循这个模式书写的xml文档,又称为实例文档)
		   XML Schema符合XML语法,易于被Sax,Dom解析,命名空间好,比DTD支持的数据类型多,约束能力强。			
			
<pre name="code" class="java"><?xml version="1.0" encoding="utf-8"?>

<书架> 
  <书> 
    <书名 name="123">JAVA就业培训教材</书名>  
    <作者>张孝祥</作者>  
    <价格>修改成功123</价格> 
  </书>  
  <书> 
    <书名>SaxJDK7.0全解</书名>  
    <作者>哈哈</作者>  
    <价格>90.00</价格> 
  </书> 
</书架>



<pre name="code" class="java">package XML及其操作;
import java.io.FileWriter;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

public class Dom4J解析Xml {

	@Test
	public void read() throws Exception{
		//解析xml文档
		SAXReader reader = new SAXReader();
		Document doc = reader.read("src/XML及其操作/Sax解析.xml");
		//得到元素
		Element root = doc.getRootElement();
		Element book = (Element) root.elements("书").get(0);
		System.out.println(book.elementText("书名"));
		//获取属性
		System.out.println(book.element("书名").attributeValue("name"));
	}
	
		@Test
		public void readAll() throws Exception{
			//解析xml文档
			SAXReader reader = new SAXReader();
			Document doc = reader.read("src/XML及其操作/dom4j解析.xml");
			//得到元素
			Element root = doc.getRootElement();
			treeWalk(root);
		}
		@Test
		public void add() throws Exception{
			SAXReader reader = new SAXReader();
			Document doc = reader.read("src/XML及其操作/dom4j解析.xml");
			//得到元素
			Element book = doc.getRootElement();
			book.element("书").element("售价").setText("23.00元");
			book.element("书").element("价格").setText("修改成功123");
			//更新document对象
			write(doc);
		}
		
		@Test
		public void delete() throws Exception{
			SAXReader reader = new SAXReader();
			Document doc = reader.read("src/XML及其操作/dom4j解析.xml");
			//得到元素
			Element price = doc.getRootElement().element("书").element("售价");
			//System.out.println(price.getText());
			//更新document对象
			price.getParent().remove(price);
			write(doc);
		}
	
		public void treeWalk(Document doc){
			treeWalk(doc.getRootElement());
		}
		
		@Test
		/**
		 * 需要jaxen-beta.jar支持
		 * @throws Exception
		 */
		public void operByXpath() throws Exception{
			SAXReader reader = new SAXReader();
			Document doc = reader.read("src/XML及其操作/dom4j解析.xml");
			//得到元素
			List list = doc.selectNodes("//作者");
			
		}
		
		public void treeWalk(Element e){
			for( int i = 0 ,   size = e.nodeCount() ; i < size ; i++){
				Node node = e.node(i);
				if(node instanceof Element){//如果子结点是仍然为元素,继续递归 (node包含5中类型:element,attr,text,comments,document) 
					treeWalk((Element)node);
				}else{
					System.out.println(node.getText());
				}
			}
		}
		
		public void write(Document doc) throws Exception{
			  // lets write to a file
	        OutputFormat format = OutputFormat.createPrettyPrint();
	        format.setEncoding("utf-8");
	        XMLWriter writer = new XMLWriter(new FileWriter("src/XML及其操作/dom4j解析.xml" ) , format );
	        writer.write( doc );
	        writer.close();
		}
}




Dom4j解析XML

标签:dom4j   xml解析   xml   

原文地址:http://blog.csdn.net/u010218226/article/details/44116389

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!