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、特殊字符必须转义:&—&;<—<;>—>;"—";’—&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();
}
}