dom4j新手进阶

1、dom4j解析xml简介

dom4j,是一个组织,针对xml解析,提供解析器 dom4j。


首先给出样本xml和我自己针对dom4j编写的工具类:

<?xml version="1.0" encoding="UTF-8"?>
<person> 
  <p1> 
    <name>zhangsan</name>  
    <age>88</age>  
    <sax>nv</sax>  
    <school>beida</school> 
  </p1>  
  <p1> 
    <name id="yangzebin">lisi</name>  
    <age>30</age> 
  </p1> 
</person>

工具类:

/*
 * 在使用该类之前,先将PATH初始化,即设置setPATH方法。
 * */
public class Dom4jUtils {
	
	
	private static String PATH = "";
	public static void setPATH(String path){
		PATH = path;
	}
	public static String getPATH(){
		return PATH;
	}
	//根据路径返回document的方法。
	public static Document getDocument(){
		try{
		SAXReader reader = new SAXReader();
		Document document = reader.read(PATH);
		return document;
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}
	
	//回写xml(缩进格式)
	public static void xmlWriterByPretty(Document document){
		try{
		OutputFormat format =OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH),format);
		xmlWriter.write(document);
		xmlWriter.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
	//回写xml(压缩格式)
	public static void xmlWritersByCompact(Document document){
		try{
		OutputFormat format =OutputFormat.createCompactFormat();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(PATH),format);
		xmlWriter.write(document);
		xmlWriter.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}


2、使用dom4j查询xml

	//查询xml中所有的name元素的值
	public static void selectName() throws Exception{
		/*
		 * 1、创建解析器
		 * 2、得到document
		 * 3、得到根节点
		 * 
		 * 4、得到p1标签
		 * 5、得到p1下面的name
		 * 6、得到name的值
		 * */
		Document document =Dom4jUtils.getDocument();
		Element root =document.getRootElement();
		List<Element> list =root.elements("p1");
		for(Element element : list){
			//element是每一个p1元素
			//得到p1下面的name元素
			Element name1=element.element("name");
			String s =name1.getText();
			System.out.println(s);
		}
	}
	//获取第一个name元素里面的值
	public static void selectFirstName() throws Exception{
		/*
		 * 1、创建解析器
		 * 2、得到document
		 * 3、得到根节点
		 * 
		 * 4、得到第一个p1标签
		 * 5、得到p1中的第一个name标签
		 * 6、获取其中的值
		 * */
		Dom4jUtils.setPATH("src/dome.xml");
		Document document =Dom4jUtils.getDocument();
		Element root=document.getRootElement();
		//得到第一个p1标签
		Element p1 = root.element("p1");
		//得到p1中的第一个name标签
		Element name =p1.element("name");
		//6、获取其中的值
		String s1 =name.getText();
		System.out.println(s1);
	}
	//在特定位置添加Node。,在第二个p1下面的age标签之前添加<school>qinghua</school>
	public static void addSchool() throws Exception{
		/*
		 * 1、创建解析器
		 * 2、得到document
		 * 3、得到根节点
		 * 
		 * 4、得到所有p1标签,得到第二个p1标签
		 * 5、得到第二个p1中的所有子标签
		 * 6、创建school标签
		 * 7、添加文本
		 * 8、将school添加到第二个p1标签中的角标1中。
		 * 10、回写xml
		 */
		Dom4jUtils.setPATH("src/dome.xml");
		Document document =Dom4jUtils.getDocument();
		Element root = document.getRootElement();
		//得到所有p1标签
		List<Element> listp1= root.elements("p1");
		//得到第二个p1标签
		Element p1By2= listp1.get(1);
		//得到第二个p1标签下的所有标签(一层)
		List<Element> listNext=p1By2.elements();
		//创建元素 school
		Element  school= DocumentHelper.createElement("school");
		//为school添加文本
		school.setText("qinghua");
		//将school添加到第二个p1标签中的角标1中。
		listNext.add(1, school);
		
		//回写xml
		 Dom4jUtils.xmlWriterByPretty(document);
	}
****单独创建element的方法:使用DocumentHelper.createElement(qname);来创建。

	//在第一个p1标签的末尾添加一个元素<sex>nv</sex>
	public static void addNode() throws Exception{
		/*
		 * 1、创建解析器
		 * 2、得到document
		 * 3、得到根节点
		 * 
		 * 4、得到第一个p1
		 * 5、在p1下面添加元素
		 * 6、在添加之后的元素下面添加文本
		 * 
		 * 7、回写xml
		 */
		 Document document =Dom4jUtils.getDocument();
		 Element root=document.getRootElement();
		 
		 Element p1=root.element("p1");
		 Element sax=p1.addElement("sax");
		 sax.setText("nv1");
		 
//		 OutputFormat format = OutputFormat.createPrettyPrint();//有缩进
//		 OutputFormat format = OutputFormat.createCompactFormat();//无缩进
		 Dom4jUtils.xmlWriterByPretty(document);
	}

4、使用dom4j修改元素

	//修改第一个p1下面的age元素的值<age>30</age>
	public static void modifyAge(){
		/*
		 * 1、得到document
		 * 2、得到第一个p1元素,
		 * 3、得到第一个p1下面的age
		 * 4、修改值为39,
		 * 
		 * 5、回写xml
		 * 
		 * */
		Dom4jUtils.setPATH("src/dome.xml");
		Document document = Dom4jUtils.getDocument();
		Element root =document.getRootElement();
		Element p1=root.element("p1");
		Element age =p1.element("age");
		age.setText("39");
		
		Dom4jUtils.xmlWriterByPretty(document);
	}
	//删除第一个p1下面的<school>标签
	public static void delSchool(){
		/*
		 * 1、得到document
		 * 2、得到根节点
		 * 3.得到第一个p1标签
		 * 4、得到school标签
		 * 5、通过父标签(p1)删除school标签
		 * 6、回写xml
		 * */
		Dom4jUtils.setPATH("src/dome.xml");
		Document document = Dom4jUtils.getDocument();
		Element root =document.getRootElement();
		List<Element> list = root.elements("p1");
		Element p1 =list.get(1);
		Element school=p1.element("school");
		p1.remove(school);
		
		Dom4jUtils.xmlWriterByPretty(document);
		
	}

5、查询元素的属性

	//获取第二个p1标签中的name的属性值。
	public static void getValues(){
		/*
		 * 1、得到document
		 * 2、得到根节点
		 * 3.得到第二个p1标签
		 * 4、得到name标签
		 * 5、得到name的属性值
		 * 	--使用attributeValue(qname)方法获取指定属性名的值。
		 * */
		Dom4jUtils.setPATH("src/dome.xml");
		Document document = Dom4jUtils.getDocument();
		Element root =document.getRootElement();
		List<Element> list = root.elements("p1");
		Element p1 =list.get(1);
		Element name =p1.element("name");
		String nameById =name.attributeValue("id");
		System.out.println(nameById);
	} 

6、下面介绍有关Xpath的表示

XPath即为XML路径语言,它是一种用来确定XML标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

使用dom4j支持xpath的操作:

可以直接获取到某个元素

常用的获取形式:

第一种形式:

/AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB

第二种形式:

//BBB:表示和这个名称相同,表示只要名称为BBB,都获取

第三种形式:

/*:所有元素

第四种形式:

BBB[1]:表示第一个BBB元素

BBB[last()]:表示最后一个BBB元素

第五种形式:

//BBB[@id]: 表示只要BBB元素上有Id属性,都获取到

第六种形式:

//BBB[@id='b1']:表示元素名称是BBB,在BBB上面有id属性,id属性值为b1

那么如何在dom4j中加以运用呢?

7、使用dom4j支持xpath具体操作

默认情况下,dom4j不支持xpath

需要导包:jaxen-1.1-beta-6.jar

在dom4j里面提供了两个方法,用来支持xpath

selectNodes("xpath表达式"):

- 获取多个节点

selectSingleNode("xpath表达式"):

- 获取单个节点

代码实现:

	//使用xpath来实现获取所有name元素里面的值
	public static void selectNameByXpath(){
		Dom4jUtils.setPATH("src/dome.xml");
		Document document =Dom4jUtils.getDocument();
		//得到该xml中所有的name节点
		List<Element> list=document.selectNodes("//name");
		for (Element element : list) {
			String name =element.getText();
			System.out.println(name);
		}
		
	}
	使用xpath来实现修改第一个p1下面的age元素里面的值
	public static void modifyageByXpath(){
		Dom4jUtils.setPATH("src/dome.xml");
		Document document =Dom4jUtils.getDocument();
		//得到p1下的age标签
		Node node =document.selectSingleNode("/person/p1/age");
		node.setText("88");
		
		Dom4jUtils.xmlWriterByPretty(document);
	}

版权声明:本文为博主原创文章,未经博主允许不得转载。如遇问题请发邮箱405678856@qq.com








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值