Dom4j解析XML

Schema定义xml文件 demo

1.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/1" xmlns:tns="http://www.example.org/1" elementFormDefault="qualified">
	<element name="person">
		<complexType>
			<sequence>
<!-- sequence 表示出现的元素顺序 不能变 -->
<!-- all 只能出现一次 -->
<!-- choice 只能出现其中的一个 -->

				<element name="name" type="string" ></element>
<!-- 					<element name="name" type="string" maxOccurs="unbounded"></element> 元素出现次数不限-->
				<element name="age" type="int"></element>
			</sequence>
<!-- 			<attribute name="id1" type="int" use="required"></attribute> 写在复杂元素,xml的person必须出现属性id1 -->
		</complexType>
	</element>
	
</schema>

被定义的person.xml

<?xml version="1.0" encoding="UTF-8"?>
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/1"
xsi:schemaLocation="http://www.example.org/1 1.xsd">
	<name>zhangsan</name>
	<age>17</age>
</person>




dom4j开始。首先先来个p1.xml

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

<person> 
  <p1 id1="xifan"> 
    <name>zhangsan</name>  
    <age>110</age>  
    <sex>男</sex>  
    <sex>男</sex>  
    <sex>男</sex> 
  </p1>  
  <p1> 
    <name>lisi</name>  
    <age>30</age> 
  </p1> 
</person>

Dom4j Demo

 package cn.itcast.dom4jtest;

import java.io.FileOutputStream;
import java.util.List;

import javax.sound.sampled.LineListener;

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;

public class TestDom4j {
	public static void main(String[] args) throws Exception {
//		selectFirstName();
//		selectName();
//		addSex();
//		addAgeBefore();
	//	modifyAge();
	//	delSch();
		getValues(); 
	}
	
	//获取属性 第一个p1里面属性id1的值
	public static void getValues() throws Exception{
		Document document = Dom4jUtils.getDocument("src/p1.xml");
		Element rootrElement =document.getRootElement();
		Element p1 = rootrElement.element("p1");
		System.out.println(p1.attributeValue("id1")); 
	}
	
	
	//删除
	public static void delSch() throws Exception{
		Document document = Dom4jUtils.getDocument("src/p1.xml");
		Element rooteElement = document.getRootElement();
		Element p1 = rooteElement.element("p1");
		Element school = p1.element("school");
		p1.remove(school);
		Dom4jUtils.xmlWriters("src/p1.xml", document);
	}
	
	//修改
	public static void modifyAge() throws Exception{
		Document document= Dom4jUtils.getDocument("src/p1.xml");
		Element rootElement = document.getRootElement();
		Element p1 = rootElement.element("p1");
		Element ageElement = p1.element("age");
		ageElement.setText("110");
		Dom4jUtils.xmlWriters("src/p1.xml", document);
	}
	
	public static void addAgeBefore() throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/p1.xml");
		Element rootElement = document.getRootElement();
		Element p1 = rootElement.element("p1");
		List<Element> list = p1.elements();
		//创建一个元素 和元素的文本
		Element school = DocumentHelper.createElement("school");
		school.setText("ecit");
		list.add(1,school);
		OutputFormat outputFormat = OutputFormat.createPrettyPrint();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/p1.xml"),outputFormat);
		xmlWriter.write(document);
		xmlWriter.close();
	}
	
	
	public static void addSex()throws Exception{
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/p1.xml");
		Element rooElement = document.getRootElement();
		Element p1 =  rooElement.element("p1");
		Element sex = p1.addElement("sex");
		sex.setText("男");
		
		//回写xml
		
		//漂亮的排版格式
		OutputFormat outputFormat = OutputFormat.createPrettyPrint();
		
		//压缩格式
		//OutputFormat outputFormat = OutputFormat.createCompactFormat();
		XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/p1.xml"),outputFormat);
		xmlWriter.write(document);
		xmlWriter.close();
	}
	
	//查询xml第一个name元素的值
	public static void selectFirstName() throws Exception{
		/*
		 * 1.创建解析器
		 * 2.得到document
		 * 3.得到根节点
		 * 
		 * 4.得到第一个p1
		 *5.得到第一个p1下面的name
		 *6.得到name的值
		 * */
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/p1.xml");
		Element rootElement = document.getRootElement();
//		List<Element> list = rootElement.elements("p1");
//		if
//		Element p1 =  list.get(0);
//		Element name1 = p1.element("name");
//		System.out.println(name1.getText());
		
		//这种也是第一个
//		Element p1 = rootElement.element("p1");
		
		
	}
	
	//查询xml所有name元素的值
	public static void selectName() throws Exception{
		/*
		 * 1.创建解析器
		 * 2.得到document
		 * 3.得到根节点
		 * 
		 * 4.得到p1
		 *5.得到p1下面的name
		 *6.得到name的值
		 * */
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/p1.xml");
		Element root = document.getRootElement();
		List<Element> list  = root.elements("p1");
		//foreach
		for (Element element : list) {
			//element是每一个p1元素
			Element name1 = element.element("name");
			System.out.println(name1.getText());
		}
		
	}

	
}

Dom4j解析工具类

public class Dom4jUtils {
	
	//创建解析器得到document
	public static Document getDocument(String path){
		try {
			SAXReader saxReader = new SAXReader();
			Document document = saxReader.read(path);
			return document;
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		return null;
	}

	//回写xml
	public static void xmlWriters(String path,Document document){
		try {
			OutputFormat format =new OutputFormat().createPrettyPrint();
			XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path), format);
			xmlWriter.write(document);
			xmlWriter.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
}

Dom4jXpth

package cn.itcast.dom4jtest;

import java.util.List;

import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class TestDom4jXpath {

	public static void main(String[] args) throws Exception {
		// test1();
		// test2();
	}

	// 使用xpath查询xml中所有name元素的值
	// 所有name元素的xpath表示://name
	// 使用selectNodes("//name");获取多个节点

	public static void test1() throws Exception {
		/**
		 * 1.得到document 2.直接使用使用selectNodes("//name");
		 */
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/p1.xml");
		List<Node> list = document.selectNodes("//sex");
		for (Node node : list) {
			System.out.println(node.getText());
		}
	}

	// 获取一个节点:selectSingleNode("xpath表达式 ")
	public static void test2() throws Exception {
		SAXReader saxReader = new SAXReader();
		Document document = saxReader.read("src/p1.xml");
		Node name1 = document.selectSingleNode("//p1[@id1='xifan']/name");
		System.out.println(name1.getText());
	}

}

dom4j-1.6.1.jar   dom4j 1.6.1下载地址

jaxen-1.1-beta-6.jar  jaxen-1.1下载地址



另外 SAX解析xml

package cn.itcast.jaxpsax;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class TestSax {

	public static void main(String[] args) throws Exception{
		/*
		 * 1.创建解析器工厂
		 * 2.创建解析器
		 * 3.执行parse方法
		 * 4.自己创建一个类,继承DefaultHandler
		 * 5.重写类里面的三个方法
		 * */
		//1
		SAXParserFactory saxParserFactory =SAXParserFactory.newInstance();
		//2
		SAXParser saxParser =saxParserFactory.newSAXParser();
		//3
		saxParser.parse("src/p1.xml", new MyDefault3());
	}

}


//实现获取所有的name元素的值
class MyDefault2 extends DefaultHandler{
	
	boolean flag = false;
	
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		//判断qName是否是name元素
		if("name".equals(qName)){
			flag =true;
		}
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		//当flag是ture时 表示解析name元素
		if(flag==true){
			System.out.println(new String(ch,start,length));
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		//把flag设置成false 表示name元素结束
		if ("name".equals(qName)) {
			flag=false;
		}
	}


	
}


//实现获取第一个name元素的值
class MyDefault3 extends DefaultHandler{
	
	boolean flag = false;
	int index = 1;
	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		//判断qName是否是name元素
		if("name".equals(qName)){
			flag =true;
		}
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		//当flag是ture时 表示解析name元素
		//索引是1
		if(flag == true && index == 1){
			System.out.println(new String(ch,start,length));
		}
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
		//把flag设置成false 表示name元素结束
		if ("name".equals(qName)) {
			index++;
		}
	}


	
}

//打印出原xml代码
class MyDefault1 extends DefaultHandler{

	@Override
	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
		System.out.print("<"+qName+">");
	}

	@Override
	public void characters(char[] ch, int start, int length) throws SAXException {
		System.out.print(new String(ch,start,length));
	}
	
	@Override
	public void endElement(String uri, String localName, String qName) throws SAXException {
	System.out.print("</"+ qName +">");
	}

	
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值