XML 学习笔记

可扩展标记语言

用于数据存储、配置文件、数据传输

一、XML约束(dtd约束)

1、创建一个student.dtd约束文件

<?xml version="1.0" encoding="UTF-8"?>
//名字为student的xml文件下 只能有students的标签
<!ELEMENT student (students*) >  
//students的标签里面必须要有name password标签
<!ELEMENT students (name,password ) >  

//声明标签的类型  #PCDATA代表字符串
<!ELEMENT name (#PCDATA)>
<!ELEMENT password (#PCDATA)>

//ATTLIST代表属性  代表students标签要有number的属性
<!ATTLIST student number ID #REQUIRED>

2、在xml添加约束

<?xml version="1.0" encoding="UTF-8"?>
<!-- 关联dtd约束文件 -->
<!DOCTYPE student SYSTEM "student.dtd">

二、xml解析(DOM4J解析)

读取xml文件内的意思

 第一步 导入包

  用于dom4j所需的包

 用于单元测试用到的包

下载地址:链接:https://pan.baidu.com/s/1j_3R7LxgXhx0BlX0aGh6jw 密码:49o0

第二步:新建books.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<书架>
<书 number= "600">
	<书名>数学</书名>
	<作者>数学作者</作者>
	<出版社>数学出版社</出版社>
	<价格>数学价格</价格>
</书>

<书 number= "100">
	<书名>英语</书名>
	<作者>英语作者</作者>
	<出版社>英语出版社</出版社>
	<价格>英语价格</价格>
</书>

<书 number= "50">
	<书名>语文</书名>
	<作者>语文作者</作者>
	<出版社>语文出版社</出版社>
	<价格>语文价格</价格>
</书>
</书架>

第三步:在java文件中解析books.xml文件

package demo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
/**
 *	单元测试:Jinit  (相当于主方法) 需导入junit包
 *	1.单元测试方法的名字都是test开头  
 * @author Administrator
 *
 */
public class demo01 {

	@Test
	public void test01() throws Exception {
		//使用dom4j对books.xml文件进行 sax解析  需要导入dom4j包
		
		//1、创建reader对象
		SAXReader reader = new SAXReader();
		
		//2、读取  读取完返回的是一个文档对象
		Document doc =  reader.read(new FileInputStream("books.xml"));
		
		//3.获取根标签  
		Element root = doc.getRootElement();
		System.out.println("根标签的名字:" + root.getName()); //控制台输出 书架
		
		//4.获取子标签
		List books = root.elements();
			//遍历子标签
		for(Object obj : books) {
			Element book = (Element) obj; //将obj转为Element对象
			System.out.println(book.getName());	//控制台输出: 书
		
			//获取书名
			System.out.println(book.element("书名").getText()); //直接通过名字去获取(获取书名标签内的内容)
			//获取作者
			System.out.println(book.element("作者").getText());
			//获取出版社
			System.out.println(book.element("出版社").getText());
			//获取价格
			System.out.println(book.element("价格").getText());
			
			
			//获取"书"标签下面的属性
			System.out.println("剩余" + book.attributeValue("number") + "本书");
		
		}
		
	}
}

 

三、dom4j的xpath查询(XPATH规则)

专门用于xml文件查询    相当于定义了一种规则

第一步 导入包

在使用XPATH之前 需要导入包

链接:https://pan.baidu.com/s/115qAu52sb_bLEVbjrFVfAA 密码:99e6

第二步 创建解析器

SAXReader reader = new SAXReader();

第三步 解析xml获得Document对象

 Document document = reader.read(url);

实例 进行XPATH操作(xml文件创建完成的前提下)

XPTH规则

//书直接找到全部书名这个节点
/书架/书/作者从跟节点一步一步查找作者节点
..选取当前节点的父节点。
//书/@number获取书节点中的Number属性
@Test
	public void test02() throws Exception {
		SAXReader reader = new SAXReader();  	//创建解析器
		Document doc =  reader.read(new FileInputStream("books.xml"));
		
		//进行XPATH查询
			//查询单个节点
		Node nodee = doc.selectSingleNode("//书名");  //直接找到xml文件下的第一个书名这个节点
		System.out.println(nodee.getText()); 	//输出的内容为"数学"
		
			//查询多个节点
		List nodes = doc.selectNodes("//书名"); 	//直接找到全部书名这个节点
		for(Object obj : nodes) {
			Node node = (Node) obj;	//将obj类型默认转为Node类型
			System.out.println(node.getText());  //获取标签内容
		}
		/* 输出的内容为
		 *  数学
			数学
			英语
			语文*/
				//从跟节点一步一步查找作者节点  用 / 
				//找到第一个作者节点
		Node authorNode = doc.selectSingleNode("/书架/书/作者");
		System.out.println("作者节点" + authorNode.getText());  // 输出内容作者节点数学作者
		
				//找作者节点的父节点
		Node authorfatherNode = authorNode.selectSingleNode("..");
		System.out.println("作结节点的父节点为:" + authorfatherNode.getName()); //书
		
	}






@Test
	public void test03() throws DocumentException {
		// @选取属性的使用
		//1、创建SAXRreader解析器
		SAXReader reader = new SAXReader();
		Document doc  = reader.read("books.xml"); //需要抛出Document异常
		
		//2、获取xml文件内某个节点的属性
		Node node = doc.selectSingleNode("//书/@number");//获取书节点中的Number属性
		//3、类型转换
		Attribute att =(Attribute) node;
		System.out.println(att.getValue());	//输出内容为600(即为第一个书节点下的Number属性值)
	}

四、xml的DOM4J修改节点并保存操作

XMLWriter对象

XMLWriter writer = new XMLWriter(new FileOutputStream("books.xml"));
writer.write(doc); //写入



public class demo02 {
	//xml的DOM4J修改节并保存点操作
	@Test
	public void test() throws Exception{
		//1、创建SAXReader解析器
		SAXReader reader = new SAXReader();
		
		//2、解析XML文件 获得Document对象
		Document doc = reader.read("books.xml");
		
		//3、把所有书标签内的number的值改为1000
		List list = doc.selectNodes("//书/@number");
		for(Object obj:list) {
			//对象是不是Attribute类型
			if(obj instanceof Attribute) {
				//获取属性对象
				Attribute att = (Attribute) obj;
				//修改属性值
				att.setValue("1000");
			}
		}
		
		//4、保存修改
		XMLWriter writer = new XMLWriter(new FileOutputStream("books.xml"));
		writer.write(doc); //写入
		writer.close();
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值