XML && Dom4J

XML
定义:eXtensible Markup Language:一种可扩展的标记语言
作用:作为配置文件,因为它是一种通用的数据交换格式(即可以使数据在不同的语言中进行使用)
来源:XML技术是W3C组织(万维网联盟)发布的,因为发布即完美,所以一直都是1.0版本

编写细节:
1、Eclipse快速创建某种文件:Window—>Perspective—>Customize Perspective—>Shortcuts–>勾选对应文件类型
2、XML文件的第一行:<?xml version="1.0" encoding="UTF-8"?>
3、XML必须有唯一的根标签
4、特殊字符必须转义:&—&amp;<—&lt;>—&gt;"—&quot;’—&apos
5、就是因为有特殊字符,所以要么转义,要么写在CDATA区(解析器不会解析里面的内容)里
<![CDATA[* <><><><><>&^*(^*(^&*(3sdfjpwrjp2024372394j*(*<> *]]>

XML约束:dtd和schema
约束的作用:编写时,规范xml标签(根据自己的要求),而且可以在工具上有相应的提示!
dtd
在这里插入图片描述
schema
在这里插入图片描述
dtd与schema的区别:
dtd:没有人约束它,容易写错,功能要简单一些
Schema:有相应的标签约束它,功能更加强大,所以也更复杂

==============================================================

DOM: Document Object Model,文档对象模型
就是把xml文件,根据标签变成树状结构,每一个元素解析成一个Node对象
在这里插入图片描述

=============================================================

Dom4J解析XML
1、导包:dom4j-1.6.1.jar
2、XPath:XML路径语言,它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,有不同类型的节点,包括元素节点,属性节点和文本节点,提供在数据结构树中找寻节点的能力。
(即:XPath 是一门在 XML 文档中查找信息的语言,用于在 XML 文档中通过元素和属性进行导航。)
3、注意:用XPath简化dom4j进行节点查找时,它依赖jaxen-1.1-beta-6.jar,记得导包
4、两种解析:逐级获取下级标签__or__通过XPath指定位置获取
扩展冷知识:这个中间的4,其实是for,简易,懂叭~

public class ParseXmlTest {
	/**解析XML文件时,如果XML用了约束,但是程序找不到对应的约束文件,是会报错的*/
	File file = new File("dtd/contacts.xml");
	
	private Document getDoc() throws DocumentException {
		//1.别人写好的类和对象:解析器,Reader,字符输入流
		SAXReader reader = new SAXReader();
		//2.document代表了  文档
		Document document = reader.read(file);
		return document;
	}
	
	/**
	 * 读取xml数据
	 */
	@Test
	public void testName() throws Exception {
		//通过解析器字符流,将硬盘上的文件加载到内存上,返回Document对象
		Document document = getDoc();
        //3.获得根标签
        Element root = document.getRootElement();
        //4.通过父标签获得子标签
        Element linkman = root.element("linkman");
        Element name = linkman.element("name");
        //5.获取文本信息
        System.out.println(name.getText());
	}
	
	/**
	 * 通过xpath解析xml
	 */
	@Test
	public void testXpath() throws Exception {
		Document doc = getDoc();
		//XML中的所有对象都是Node对象
		//通过XPath获得指定节点对象
        Node node = doc.selectSingleNode("/contacts/linkman[1]/name");
        String text = node.getText();
        System.out.println(text);
	}
	
	/**
	*  其实增删改,就是先把xml读取到内存中,对DOM对象操作之后,再输出到硬盘上
	*/
	/**
	 * xml添加操作
	 */
	@Test
	public void testAdd() throws Exception {
		Document doc = getDoc()
        
        Element contacts = doc.getRootElement();
        //contacts下面添加了linkman  ,返回的就是linkman对象
        Element linkman = contacts.addElement("linkman");
        //linkman添加属性
        linkman.addAttribute("id", "3");
        
        linkman.addElement("name").setText("sss");
        linkman.addElement("email").setText("2333@qq.com");
        linkman.addElement("address").setText("北京");
        linkman.addElement("group").setText("仙女");
        
        //原生的格式:数据都在一行,丑但是节约空间
       /* XMLWriter writer = new XMLWriter(
                new FileWriter( file )
            );
        writer.write( doc );
        writer.close();*/
        
        prettyPrint(doc);
	}
	
	/**
	 * 更新操作
	 */
	@Test
	public void testUpdate() throws Exception {
		Document doc = getDoc();
       
        Node name = doc.selectSingleNode("/contacts/linkman[2]/name");
        name.setText("qq");
        
        prettyPrint(doc);
	}

	
	/**
	 * 删除操作
	 * remove方法只有Element接口有,Node接口没有,所以要强转
	 */
	@Test
	public void testRemove() throws Exception {
		Document doc = getDoc();
        
        Element linkman = (Element)doc.selectSingleNode("/contacts/linkman[2]");
        Node name = doc.selectSingleNode("/contacts/linkman[2]/name");
        //父节点移除子节点
        linkman.remove(name);
        
        //或者节点自己获取父节点,来移除自己
		//name.getParent().remove(name);
	
        prettyPrint(doc);
	}
	
	/**
	 * 将内存中的Document按照标准xml格式输出,不然就是一行,不好看
	 */
	private void prettyPrint(Document doc) throws IOException {
		//漂亮打印
		OutputFormat format = OutputFormat.createPrettyPrint();
		XMLWriter writer = new XMLWriter( new FileWriter( file ), format );
		writer.write( doc );
		writer.close();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值