dom4j xml解析 写框架必备技能(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljk126wy/article/details/82862194

为了尽可能的阅读官网文档 百度dom4j ,说是在sourceForge 可以找到。特意访问https://sourceforge.net/projects/dom4j/ 网址进行查看 发现该项目已经迁移至github: https://github.com/dom4j/dom4j

github上有一个介绍的地址:https://dom4j.github.io 里面介绍如下使用dom4j

我们这里介绍dom4j-1.6.1 的版本

1 创建mavne项目 引入dom4j需要的依赖

          <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>jaxen</groupId>
            <artifactId>jaxen</artifactId>
            <version>1.1.6</version>
        </dependency>

2 在resource目录下创建 book.xml

<?xml version="1.0" encoding="UTF-8"?>
<books desc="this is a exam">
	<book name="java从入门到放弃" press="NO1">
		<author sex="man" age="18">tom</author>
		<describe>Don't give up</describe>
	</book>
	<book name="mysql从入门到放弃" press="NO1">
		<author sex="man" age="18">tom</author>
		<describe>Don't give up</describe>
	</book>
	<book name="python从入门到放弃" press="NO2">
		<author sex="woman"  age="20">jerry</author>
		<describe>Don't give up</describe>
	</book>
	<book name="php从入门到放弃" press="NO2">
		<author sex="woman"  age="20">jerry</author>
		<describe>Don't give up</describe>
	</book>
</books>

解析XMl

package cn.lijunkui.exam;

import java.io.InputStream;
import java.net.URL;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import junit.framework.Assert;

public class ExamShow {
	
	@Test
	public void getDocument() throws DocumentException {
		//通过URL获取解析
		URL resource = ExamShow.class.getClassLoader().getResource("book.xml");
		SAXReader reader = new SAXReader();
		Document document = reader.read(resource);
		String asXML = document.asXML();
		Assert.assertTrue( !"".equals(asXML));
		//通过输入流解析
		InputStream resourceAsStream = ExamShow.class.getClassLoader().getResourceAsStream("book.xml");
		SAXReader reader2 = new SAXReader();
		Document document2 = reader.read(resourceAsStream);
		String asXML2 = document2.asXML();
		Assert.assertTrue( !"".equals(asXML2));
		//通过磁盘路径进行解析
		SAXReader reader3 = new SAXReader();
		Document document3 = reader.read("D:/workspace-sts-3.9.5.RELEASE/parsexmllearn/target/classes/book.xml");
		String asXML3 = document3.asXML();
		Assert.assertTrue( !"".equals(asXML3));
	}
}

查询操作

elementIterator

扫描二维码关注公众号,回复: 3645940 查看本文章
	@Test
	public void elementIterator() {
		System.out.println("----------------------------------------------------");
		Element rootElement = document.getRootElement();
		//遍历根几点下的节点内容
	    for (Iterator<Element> it = rootElement.elementIterator(); it.hasNext();) {
	        Element bookelement = it.next(); 
	        Attribute nameAttribute = bookelement.attribute("name");
	        Attribute pressAttribute = bookelement.attribute("press");
	        System.out.println("书的名称:"+nameAttribute.getValue());
	        System.out.println("书的出版社:"+pressAttribute.getValue());
	        System.out.println();
	        for (Iterator<Element> bookChildit = bookelement.elementIterator(); bookChildit.hasNext();) {
	        	Element bookChildElement = bookChildit.next();
		        if("author".equals(bookChildElement.getName())) {
		        	Attribute sexAttribute = bookChildElement.attribute("sex");
		        	Attribute ageAttribute = bookChildElement.attribute("age");
		        	String authorName = bookChildElement.getText();
		        	  System.out.println("作者的名称:"+authorName);
		        	  System.out.println("作者的性别:"+sexAttribute.getValue());
		        	  System.out.println("作者的年龄:"+ageAttribute.getValue());
		        }else {
		        	String describe = bookChildElement.getText();
		        }
		        
	        }
	        
	    }
	    System.out.println("----------------------------------------------------");
	   //指定节点名称进行便利 根节点下的子节点
	    for (Iterator<Element> it = rootElement.elementIterator("book"); it.hasNext();) {
	    	 Element bookelement = it.next(); 
		        Attribute nameAttribute = bookelement.attribute("name");
		        Attribute pressAttribute = bookelement.attribute("press");
		        System.out.println("书的名称:"+nameAttribute.getValue());
		        System.out.println("书的出版社:"+pressAttribute.getValue());
		        System.out.println();
		        for (Iterator<Element> bookChildit = bookelement.elementIterator(); bookChildit.hasNext();) {
		        	Element bookChildElement = bookChildit.next();
			        if("author".equals(bookChildElement.getName())) {
			        	Attribute sexAttribute = bookChildElement.attribute("sex");
			        	Attribute ageAttribute = bookChildElement.attribute("age");
			        	String authorName = bookChildElement.getText();
			        	  System.out.println("作者的名称:"+authorName);
			        	  System.out.println("作者的性别:"+sexAttribute.getValue());
			        	  System.out.println("作者的年龄:"+ageAttribute.getValue());
			        }else {
			        	String describe = bookChildElement.getText();
			        }
			        
		        }
	      
	    }
	    System.out.println("----------------------------------------------------");
	   //获取根节点所有的属性
	    for (Iterator<Attribute> it = rootElement.attributeIterator(); it.hasNext();) {
	        Attribute attribute = it.next();
	       System.out.println(attribute.getName()+","+attribute.getValue());
	    }
	}

elements

	@Test
	public void elements() {
		Element rootElement = document.getRootElement();
		List<Element> elements = rootElement.elements();
		for (Element bookelement : elements) {
			 Attribute nameAttribute = bookelement.attribute("name");
		     Attribute pressAttribute = bookelement.attribute("press");
		     System.out.println("书的名称:"+nameAttribute.getValue());
		     System.out.println("书的出版社:"+pressAttribute.getValue());
		     List<Element> bookChildEles = bookelement.elements();
		     for (Element bookChildEle : bookChildEles) {
		    	 if("author".equals(bookChildEle.getName())) {
			        	Attribute sexAttribute = bookChildEle.attribute("sex");
			        	Attribute ageAttribute = bookChildEle.attribute("age");
			        	String authorName = bookChildEle.getText();
			        	  System.out.println("作者的名称:"+authorName);
			        	  System.out.println("作者的性别:"+sexAttribute.getValue());
			        	  System.out.println("作者的年龄:"+ageAttribute.getValue());
			        }else {
			        	String describe = bookChildEle.getText();
			        }
			}
		}
	}
	@Test
	public void elementsByName() {
		Element rootElement = document.getRootElement();
		List<Element> elements = rootElement.elements("book");
		for (Element bookelement : elements) {
			 Attribute nameAttribute = bookelement.attribute("name");
		     Attribute pressAttribute = bookelement.attribute("press");
		     System.out.println("书的名称:"+nameAttribute.getValue());
		     System.out.println("书的出版社:"+pressAttribute.getValue());
		     List<Element> bookChildEles = bookelement.elements();
		     for (Element bookChildEle : bookChildEles) {
		    	 if("author".equals(bookChildEle.getName())) {
			        	Attribute sexAttribute = bookChildEle.attribute("sex");
			        	Attribute ageAttribute = bookChildEle.attribute("age");
			        	String authorName = bookChildEle.getText();
			        	  System.out.println("作者的名称:"+authorName);
			        	  System.out.println("作者的性别:"+sexAttribute.getValue());
			        	  System.out.println("作者的年龄:"+ageAttribute.getValue());
			        }else {
			        	String describe = bookChildEle.getText();
			        }
			}
		}
	}

获取指定位置的元素 getText

	@Test
	public void getElementsByIndex() {
		Element rootElement = document.getRootElement();
		List<Element> elements = rootElement.elements("book");
		Element bookEle = elements.get(0);
		Attribute nameAttribute = bookEle.attribute("name");
	    Attribute pressAttribute = bookEle.attribute("press");
	    System.out.println("书的名称:"+nameAttribute.getValue());
	    System.out.println("书的出版社:"+pressAttribute.getValue());
	    List<Element> authorEles = bookEle.elements("author");
	    Element element = authorEles.get(0);
	    String authorName = element.getText();
	    System.out.println("作者名称:"+authorName);
	}

dom4j 的增删改查

	@Test
	public void add() throws IOException {
		//获取根元素的节点
		Element rootElement = document.getRootElement();
		//获取第一个book元素的节点
		List<Element> es=rootElement.elements();
		Element book=es.get(0);
		//创建一个新的element名字叫version 对其进行值的添加
		Element version = DocumentHelper.createElement("version");
		version.setText("10");
		book.add(version);
		// 进行xml回写
		OutputFormat forment=OutputFormat.createPrettyPrint();
		forment.setEncoding("utf-8");
		ClassLoader classLoader = ExamShow.class.getClassLoader();
		URL resource = classLoader.getResource("book.xml");
		String path = resource.getPath();
		XMLWriter writer=new XMLWriter(new FileWriter(new File(path)),forment);
		writer.write(rootElement);
		writer.close();
	}

修改

	@Test
	public void edit() throws IOException {
		//获取根元素的节点
		Element rootElement = document.getRootElement();
		//获取第一个book元素的节点
		List<Element> es=rootElement.elements();
		Element book=es.get(0);
		//创建一个新的element名字叫version 对其进行值的添加
		List<Element> versions = book.elements("version");
		Element version = versions.get(0);
		
		version.addAttribute("a","c");
		version.setText("第3个版本");
		
		// 进行xml回写
		OutputFormat forment=OutputFormat.createPrettyPrint();
		forment.setEncoding("utf-8");
		ClassLoader classLoader = ExamShow.class.getClassLoader();
		URL resource = classLoader.getResource("book.xml");
		String path = resource.getPath();
		XMLWriter writer=new XMLWriter(new FileWriter(new File(path)),forment);
		writer.write(rootElement);
		writer.close();
	}

删除

	@Test
	public void remove() throws IOException {
		//获取根元素的节点
		Element rootElement = document.getRootElement();
		//获取第一个book元素的节点
		List<Element> es=rootElement.elements();
		Element book=es.get(0);
		
		Element version = book.element("version");
		book.remove(version);//通过父获取子删除子
		//version.getParent().remove(version);//通过子获取父删除子
		//book.remove(book.attribute("name"));//删除book的属性
		
		// 进行xml回写
		OutputFormat forment=OutputFormat.createPrettyPrint();
		forment.setEncoding("utf-8");
		ClassLoader classLoader = ExamShow.class.getClassLoader();
		URL resource = classLoader.getResource("book.xml");
		String path = resource.getPath();
		XMLWriter writer=new XMLWriter(new FileWriter(new File(path)),forment);
		writer.write(rootElement);
		writer.close();
	}

在指定位置添加指定元素

	@Test
	public void addIndex() throws IOException, DocumentException {
		//获取根元素的节点
		Element rootElement = document.getRootElement();
		String addContent = "  <book name=\"mysql从入门到放弃2\" press=\"NO1\"> \r\n" + 
							    "<author sex=\"man\" age=\"182\">tom</author>  \r\n" + 
								"<describe>Don't give up</describe> \r\n" + 
							   "</book>  ";
		Document book=DocumentHelper.parseText(addContent);
		rootElement.elements().add(1,book.getRootElement());
		
		// 进行xml回写
		OutputFormat forment=OutputFormat.createPrettyPrint();
		forment.setEncoding("utf-8");
		ClassLoader classLoader = ExamShow.class.getClassLoader();
		URL resource = classLoader.getResource("book.xml");
		String path = resource.getPath();
		XMLWriter writer=new XMLWriter(new FileWriter(new File(path)),forment);
		writer.write(rootElement);
		writer.close();
	}

dom4j xPath 查询

selectSingleNode 和 selectNodes

	@Test
	public void xPath() {
		List<Element> selectNodes = document.selectNodes("//author");
		for (Element element : selectNodes) {
			String authorName = element.getText();
			Attribute sexAttribute = element.attribute("sex");
			Attribute ageAttribute = element.attribute("age");
			System.out.println("老师的名称:"+authorName);
			System.out.println("老师的年龄:"+sexAttribute.getValue());
			System.out.println("老师的性别:"+ageAttribute.getValue());
		}
	}
	@Test
	public void xPaht2() {
		Element authorEle = (Element) document.selectSingleNode("//author[@age='182']");
		String authorName = authorEle.getText();
		Attribute sexAttribute = authorEle.attribute("sex");
		Attribute ageAttribute = authorEle.attribute("age");
		System.out.println("老师的名称:"+authorName);
		System.out.println("老师的年龄:"+sexAttribute.getValue());
		System.out.println("老师的性别:"+ageAttribute.getValue());
	}

猜你喜欢

转载自blog.csdn.net/ljk126wy/article/details/82862194
今日推荐