1.XML的简介
- eXtensible Markup Language:可扩展标记型语言
- 标记型语言:html是标记型语言,xml也是标记型语言,使用标签来操作
- 可扩展
- html里面的标签是固定的,每个标签都有特定的含义 <h1> <br/> <hr/>
- 标签可以自己定义,可以写中文的标签 <person></person>、<猫></猫>
- xml用途
- html是用于显示数据,xml也可以显示数据(不是主要功能)
- xml主要功能,为了存储数据
- xml是w3c组织发布的技术
- xml有两个版本1.0和1.1。现在使用的都是1.0版本,1.1版本不能向下兼容
2.XML的应用
- 不同系统之间传输数据
- QQ之间数据的传输
- 画图分析过程
- 用来标识生活中有关系的数据
- 经常用在文件配置
- 比如现在连接数据库,肯定知道数据库的用户名和密码,数据名称
- 如果要修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了
3.XML的语法
1.xml的文档声明
- 创建一个文件,后缀名是 .xml
- 如果写xml,第一步,必须要有一个文档声明(写了文档声明之后,表示写xml文件的内容)
<?xml version=”1.0” encoding=”gbk”?>
文档声明必须写在第一行第一列
- version:xml的版本 1.0(使用) 1.1
- encoding:xml编码 gbk utf-8 is8859-1(不包含中文)
- standalone:是否需要依赖其他文件 yes/no
<?xml version="1.0" encoding="gbk"?>
<person>
<name>zhangsan</name>
<age>20</age>
</person>
- xml的中文乱码问题解决
只要将保存时的编码和设置打开时候的编码(文档声明中的encoding)一致,就不会出现乱码问题
2.定义元素(标签)
3.定义属性
4.注释
5.特殊字符
6.CDATA区(了解)
7.PI指令(了解)
4.XML的元素定义
标签定义:
- 标签定义有开始必须有结束:<person></person>
- 标签没有内容,可以在标签内结束<aa/>
- 标签可以嵌套,但必须要合理嵌套
- 合理嵌套:<aa><bb></bb></aa>
- 不合理嵌套:<aa><bb></aa></bb>
- 一个xml中,只能有一个根标签,其他标签都是这个标签下面的标签
- 在xml中把空格和换行都当成内容来解析
- 下面这两端代码含义是不一样的
- <aa>11111111</aa>
- <aa>
111111111
</aa>
- xml中标签的名称规则
- xml代码区分大小写:<p><P>这两个标签是不一样的
- xml的标签不能以数字和下划线开头<2a><_aa>
- xml的标签不能以xml、XML、Xml等开头<xmla><XmlB><XMLC>
- xml的标签不能包含空格和冒号<a b><b:c>
5.XML的属性的定义
- html是标记型文档,可以有属性
- xml也是标记型文档,也可以有属性
- <person id1=”aaa” id2=”aaa”></person>
- 属性定义的要求:
- 一个标签上可以有多个属性<person id1=”aaa” id2=”aaa”></person>
- 属性名称不能相同:<person id1=”aaa” id1=”aaa”></person>这个是不正确的
- 属性名称和属性值之间使用=,属性值使用引号(可以是双引号,也可以是单引号)
- xml属性的名称规范和元素的名称规范一致
6.XML的注释
- 写法:<!- - xml的注释 - ->
- 注意:注释不能嵌套
- 注释不能放到第一行,第一行第一列必须放文档声明
7.xml中的特殊字符
- 如果想要在xml中显示a<b,不能正常显示,因为把<当做标签
- 如果想要显示,需要对特殊字符进行转义
8.XML的CDATA区
可以解决多个字符都需要转义的操作 if(a<b && b<c && d>f) {}
把这些内容放到CDATA区里面,就不需要转义了
写法:
<![CDATA[ 内容 ]]>
<![CDATA[ <b>if(a<b && b<c && d>f)</b> ]]>
把特殊字符当做文本内容,而不是标签
9.XML的PI指令
- 可以在xml中设置样式
- 写法:<?xml-stylesheet type=”text/css” href=”css的路径”?>
<?xml-stylesheet type=”text/css” href=”1.css”?> - 不能放在第一行
10.XML的约束
为什么需要约束?
<?xml version="1.0" encoding="utf-8"?>
<person>
<name>zhangsan</name>
<age>20</age>
<猫>10000</猫>
</person>
比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name,age等,但是如果在xml文件中写了一个标签<猫>,发现可以正常显示,因为符合语法规范,但是猫肯定不是人的信息,xml的标签是自定义的,需要技术来规定xml这种智能出现的元素,在这个时候就需要约束。
xml的约束的技术:
- dtd约束
- schema约束(看懂)
11.DTD的快速入门
创建一个文件,后缀名 .dtd
(1)看xml中有多少个元素,有几个元素,在dtd文件中写几个 <!ELEMENT>
(2)判断元素是简单元素还是复杂元素
- 复杂元素:有子元素的元素
<ELEMENT 元素名称 (子元素)> - 简单元素:没有子元素
<ELEMENT 元素名称 (#PCDATA)>
(3)需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM “dtd文件的路径”>
- 打开xml文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责校验约束
- 如果想要校验xml的约束,需要使用工具(eclipse工具)
1.dtd:
<!ELEMENT person(name,age)>
<!ELEMENT name(#PCDATA)>
<!ELEMENT age(#PCDATA)>
1.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person SYSTEM "1.dtd">
<person>
<name>zhangsan</name>
<age>20</age>
<!-- <a>111</a> 这里会报错 -->
</person>
12.DTD的三种引入方式
- 引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
- 使用内部的dtd文件(在xml文件内编写DTD)
<!DOCTYPE 根元素名称 [
<!ELEMENT person (name,age)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person[
<!ELEMENT person (name,age)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
- 使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
后面学到框架struts2使用配置文件,使用的就是外部的dtd文件
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
13.使用DTD定义元素
- 语法:<!ELEMENT 元素名 约束>
- 简单元素:<!ELEMENT name (#PCDATA)>
- (#PCDATA):约束name是字符串类型
- EMPTY:元素为空(没有内容)<sex></sex>
- ANY:任意
- 复杂元素:<!ELEMENT 元素名称 (子元素)>
- <!ELEMENT person (name,age,sex,school)>子元素直接使用逗号隔开,表示子元素只能出现一次,并且子元素出现的顺序只能按照这个顺序
- +:表示子元素出现一次或者多次
- ?:表示子元素出现零次或者一次
- *:表示任意次
- <!ELEMENT person (name|age|sex|school)>子元素使用 | 隔开,表示子元素只能出现其中的任意一个
- <!ELEMENT person (name,age,sex,school)>子元素直接使用逗号隔开,表示子元素只能出现一次,并且子元素出现的顺序只能按照这个顺序
1.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name+,age?,sex*,school)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex EMPTY>
<!ELEMENT school ANY>
]>
<person>
<name>zhangsan1</name>
<name>zhangsan2</name>
<name>zhangsan3</name>
<age>20</age>
<sex></sex>
<sex></sex>
<school>11111</school>
</person>
14.使用DTD定义属性
语法:<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
属性类型:
- CDATA:字符串
- 枚举:表示在一定的范围内出现值,但是只能每次出现其中的一个
- ID:值只能是字母或者下划线开头
属性约束:
- #REQUIRED:属性必须存在
- #IMPLIED:属性可有可无
- #FIXED:表示一个固定值,属性的值必须是设置的这个固定值
<!ATTLIST sex
ID4 CDATA #FIXED “ABC”
>
- 直接值:不写属性,使用直接值作为默认值;写了属性,使用设置的值
<!ATTLIST school
ID5 CDATA “WWW”
>
1.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name+,age?,sex*,school,birthday)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID3 ID #REQUIRED
>
<!ELEMENT age (#PCDATA)>
<!ATTLIST age
ID2 (AA|BB|CC) #IMPLIED
>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
<!ELEMENT school ANY>
<!ELEMENT birthday (#PCDATA)>
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
]>
<person>
<name ID3="aaa2">zhangsan1</name>
<name ID3="_aa">zhangsan2</name>
<age ID2="AA">20</age>
<sex ID4="ABC"></sex>
<school>11111</school>
<birthday ID1="AAA">2015</birthday>
</person>
15.实体
语法:<!ENTITY 实体名称 “实体的值”>
使用实体:&实体名称
1.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE person [
<!ELEMENT person (name)>
<!ELEMENT name (#PCDATA)>
<!ATTLIST name
ID3 ID #REQUIRED
>
<!ENTITY test "hahahehe">
]>
<person>
<name ID3="aaa2">&test;</name>
</person>
16.XML解析
xml是标记型文档
js使用dom解析标记型文档:
- 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
- document对象、element对象、属性对象、文本对象、Node节点对象
XML解析有两种方式:dom和sax
想要解析xml,首先需要解析器
不同的公司和组织提供了不同的针对dom和sax方式的解析器,通过api方式提供
- sun公司提供了针对dom和sax的解析器:jaxp
- dom4j组织提供了针对dom和sax的解析器:dom4j
- jdom组织提供了针对dom和sax的解析器:jdom
17.jaxp的api的查看
jaxp是javase的一部分
jaxp解析器在javase的jdk的javax.xml.parsers包里面
javax.xml.parsers包中包含四个类:分别针对dom和sax解析使用的类
- dom
- DocumentBuilder:解析器类
这个类是一个抽象类,不能new
它的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
DocumentBuiler类方法:
- parse(“xml路径”):可以解析xml,返回Document整个文档。返回的document是一个接口,它的父接口是Node。
- Document接口的方法:
- getElementsByTagName(String tagname):可以得到标签,返回集合NodeList,遍历NodeList就可以得到Node
- NodeList接口的方法:
- getLength():得到集合的长度
- item(int index):下标取到的具体的值,返回一个Node类型的值
- Node接口的方法
- getTextContent():得到标签里面的内容
- createElement(String tagName):创建标签
- createTextNode(String date):创建文本
- appendChild(Node newChild):把文本添加到标签下面(父接口Node中的方法)
- removeChild(Node oldChild):删除节点(父接口Node中的方法)
- getParentNode():获取父节点(父接口Node中的方法)
- -
- parse(“xml路径”):可以解析xml,返回Document整个文档。返回的document是一个接口,它的父接口是Node。
- DocumentBuilderFactory:解析器工厂
这个类也是一个抽象类,不能new
可以通过静态方法newInstance()获取DocumentBuilderFactory的实例
- DocumentBuilder:解析器类
- sax
- SAXParser:解析器类
- SAXParserFactory:解析器工厂
18.使用jaxp实现查询操作
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml返回document对象
4.得到所有的name元素的NodeList集合
5.返回集合,遍历集合,得到每一个name元素
person.xml:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age>30</age>
</p1>
</person>
TestJaxp.java
public class TestJaxp {
public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
//1.创建解析器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//2.根据解析器工厂创建解析器
DocumentBuilder builder = factory.newDocumentBuilder();
//3.解析xml返回document对象
Document document = builder.parse("src/person.xml");
//4.得到所有的name元素的NodeList集合
NodeList nodeList = document.getElementsByTagName("name");
5.返回集合,遍历集合,得到每一个name元素
for(int i = 0; i < nodeList.getLength(); i++){
Node node = nodeList.item(i);
System.out.println(node.getTextContent());
}
}
}
19.使用jaxp添加节点
目标:在第一个p1下面添加<sex>nv<sex>
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml,返回document
4.使用 item(int index)方法得到第一个p1
5.使用createELement创建sex标签
6.使用createTextNode创建文本
7.使用appendChild把文本添加到sex下面
8.把sex添加到第一个p1下面
9.因为我们这时候操作的其实是内存中的dom树,所以还需要把内容中的数据回写到硬盘上的xml文件
TestJaxp.java
public class TestJaxp {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
NodeList nodeList = document.getElementsByTagName("p1");
Node p1 = nodeList.item(0);
Element sexEle = document.createElement("sex");
Text textEle = document.createTextNode("nv");
sexEle.appendChild(textEle);
p1.appendChild(sexEle);
//回写
TransformerFactory transFormerFactory = TransformerFactory.newInstance();
Transformer transformer = transFormerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
}
20.使用jaxp修改节点
步骤:使用setTextContent方法
public class TestJaxp {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
NodeList nodeList = document.getElementsByTagName("sex");
Node sexEle = nodeList.item(0);
//调用setTextContent方法修改节点内容
sexEle.setTextContent("nan");
//回写
TransformerFactory transFormerFactory = TransformerFactory.newInstance();
Transformer transformer = transFormerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
}
21.使用jaxp删除节点
步骤:
获取要删除的节点
获取要删除节点的父节点
调用父节点的removeChild方法删除节点
回写
public class TestJaxp {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
//得到要删除的sex节点
Node sexEle = document.getElementsByTagName("sex").item(0);
//sex节点的父节点
Node parentEle = sexEle.getParentNode();
//调用父节点的removeChile()方法
parentEle.removeChild(sexEle);
//回写
TransformerFactory transFormerFactory = TransformerFactory.newInstance();
Transformer transformer = transFormerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
}
22.使用jaxp遍历所有节点
思想:递归
步骤:
1.创建解析器工厂
2.根据解析器工厂创建解析器
3.解析xml,返回document
使用递归:
4.得到根节点
5.得到根节点的子节点
6.得到根节点的子节点的子节点
public class TestJaxp {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
list(document);
}
public static void list(Node node) {
//判断是元素类型的时候才打印
if(node.getNodeType() == Node.ELEMENT_NODE){
System.out.println(node.getNodeName());
}
//得到一层子节点
NodeList nodeList = node.getChildNodes();
for(int i=0; i<nodeList.getLength(); i++){
Node node1 = nodeList.item(i);
list(node1);
}
}
}
23.schema的开发过程
开发步骤:
- XSD:
1)创建一个schema文件,后缀名是 .xsd,它其实也是一个xml,它的根节点是<schema>
1.schema标签的属性:
①xmlns=”http://www.w3.org/2001/XMLSchema”:固定值,表示当前xml文件是一个约束文件
②targetNamespace=”http://www.example.org/1”:在xml文件中使用这个地址来引入约束文件,什么值都可以,但为了防止重复一般使用url地址
③elementFormDefault=”qualified”:表示可用
2.schema标签中的内容:
①看xml中有多少个元素,有几个元素就有几个<element>
②看简单元素和复杂元素
如果是复杂元素
<element name="">
<complexType>
<sequence>
子元素
</sequence>
</complexType>
</element>
如果是简单元素,就写在复杂元素的<squence>标签中
<element name="">
<complexType>
<sequence>
<element name="" type=""></element>
</sequence>
</complexType>
</element>
- XML:
在xml文件中引入约束文件
<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">
</person>
- xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” :表示xml是一个被约束文件,其中xsi是名称空间,类似于包的作用,用于区分导入的不同的xmlns。如果想使用不同约束文件中的元素就用<名称空间:元素>来使用。
- xmlns=”http://www.example.org/1”:是.xsd约束文件中的targetNamespace
- xsi:schemaLocation=”http://www.example.org/1 1.xsd”:targetNamespace 空格 约束文档的地址路径
示例:
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="p1">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</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"
>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age>30</age>
</p1>
</person>
24.schema的约束的api
XMLSchema复杂元素指示器:
- ALL:表示只能出现一次
- Choice:只能出现其中的一个
- Sequence:元素按照顺序出现
- maxOccurs=”unbounded”表示出现次数没限制
<element name=”name” type=”double” maxOccurs=”unbounded”/>
- 定义属性(必须是复杂元素):<attribute name=”p1” type=”string” user=”required”></attribute>
写在</complexType>之前,name:属性名称,type:属性类型,use:属性是否必须出现
- <any></any>:表示任意元素
25.使用sax解析xml的过程
解析xml有两种技术:dom和sax
使用sax解析方式:事件驱动,边读边解析
在javax.xml.parsers包中有两个类
- SAXParser:
这个类的实例可以从SAXParserFactory.newSAXParser()方法获得
parser(File f, DefaultHandler db):第一个参数是xml的路径,第二个参数是一个事件处理器 - SAXParserFactory:
这个类的实例可以由newInstance()方法得到
画图分析sax的执行过程:
当解析到开始标签的时候,自动执行startElement方法
当解析到文本的时候,自动执行characters方法
当解析到结束标签的时候,自动执行endElement方法
26.使用jaxp的sax方式解析xml
sax方式不能实现增删改操作,只能做查询操作
例1:打印出整个文档
执行parse方法,第一个参数xml路径,第二个参数是一个事件处理器
创建一个类,继承事件处理器的类,重写里面的三个方法
Person.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>zhangsan</name>
<age>20</age>
</p1>
<p1>
<name>lisi</name>
<age>30</age>
</p1>
</person>
SAXTest.java:
public class SAXTest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse("src/person.xml", new MyDefaultHandler());
}
}
class MyDefaultHandler extends DefaultHandler{
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.print("<" + qName + ">");
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.print("<" + qName + ">");
}
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.print(new String(ch, start, length));
}
}
例2:打印出所有name
class MyDefaultHandler2 extends DefaultHandler{
boolean flag = false;
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
//判断qName是否是name元素
if(qName.equals("name")){
flag = true;
}
}
public void endElement(String uri, String localName, String qName)
throws SAXException {
//把falg的值变成false
if(qname.equals("name")){
flag = false;
}
}
public void characters(char[] ch, int start, int length)
throws SAXException {
//当flag的值是true的时候,表示解析到name元素
if(flag){
System.out.println(new String(ch, start, length));
}
}
}
例3:获取第一个name
思路:添加一个index=1,当index==1的时候打印name
27.使用dom4j解析xml
dom4j是一个组织,针对xml解析,提供解析器 dom4j
dom4j不是javase的一部分,想要使用需要导入dom4j的jar包
- 得到document:
SAXReader reader = new SAXReader();
Document document = reader.read(url); - Document接口中的方法:
getRootElement():获取根节点,返回Element - Element接口中的方法:
element(String qname):表示获取标签下面的第一个字标签,qname是字标签的名称
elements(String qname):获取标签下面所有该名称的字标签
elements():获取标签下面的所有一层字标签
getText():获取标签的内容
getParent():获取父节点
addElement():添加标签
28.使用dom4j实现查询xml操作
例1:查询所有name元素里面的值
public static void selectAll() throws Exception {
//创建解析器
SAXReader saxReader = new SAXReader();
//得到document
Document document = saxReader.read("src/person.xml");
//得到根节点
Element root = document.getRootElement();
List<Element> list = root.elements("p1");
for(Element element : list){
Element nameEle = element.element("name");
//得到name里面的值
System.out.println(nameEle.getText());
}
例2:查询第一个name元素里面的值
public static void selectFirst() throws Exception {
//创建解析器
SAXReader saxReader = new SAXReader();
//得到document
Document document = saxReader.read("src/person.xml");
//得到根节点
Element root = document.getRootElement();
Element p1 = root.element("p1");
Element name = p1.element("name");
System.out.println(name.getText());
}
}
29.使用dom4j添加节点
例1:在第一个p1的age节点下面添加sex节点
步骤:
1.创建解析器
2.得到document
3.得到根节点
4.获取第一个p1:使用element方法
5.在p1下面添加元素:以前使用jaxp的时候需要先创建元素,再添加到父元素上,使用dom4j不需要创建,直接使用addElement(“标签名称”)方法添加即可,返回一个Element
6.在添加完成之后的元素下面添加文本:使用setText(“文本内容”)方法
7.回写xml
- 格式化OutputFormat
- 使用createPrettyPrint方法,表示一个漂亮的格式
- 使用createCompactFormat方法,表示一个紧凑的格式
- 使用类XMLWriter,直接new这个类,传递两个参数
- 第一个参数是xml文件路径 new FileOutputStream(“路径”)
- 第二个参数是格式化类型的值
public static void addElement() throws Exception {
// TODO Auto-generated method stub
SAXReader reader = new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
//获取p1节点
Element p1 = root.element("p1");
//在p1下面添加sex节点
Element sex = p1.addElement("sex");
//在sex下面添加文本
sex.setText("nv");
//回写xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src/person.xml"), format);
writer.write(document);
writer.close();
}
例2:在指定位置添加节点。第一个p1的age节点上添加school节点
public static void addSchool() throws Exception {
SAXReader reader = new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
List<Element> list = p1.elements();
//创建元素,使用DocumentHelper帮助类
Element school = DocumentHelper.createElement("school");
//在school下面创建文本
school.setText("ecit");
//在特定位置添加
list.add(1, school);
//回写
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(new FileOutputStream("src/person.xml"), format);
writer.write(document);
writer.close();
}
30.使用dom4j修改节点内容
使用Element接口中的setText()方法
回写
31.使用dom4j删除节点
使用Element接口中的getParent()方法获取到父节点,然后调用父节点的remove(Element element)方法删除节点
回写
31.使用dom4j获取节点的属性值
使用Element接口的attributeValue(String arg)方法获取属性值
person.xml:
<?xml version="1.0" encoding="UTF-8"?>
<person xmlns="http://www.example.org/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/1 1.xsd">
<p1 id="aaa">
<name>zhangsan</name>
<school xmlns="">ecit</school>
<age>20</age>
<sex>nv</sex>
</p1>
<p1>
<name>lisi</name>
<age>30</age>
</p1>
</person>
TestDom4j.java:
public static void getValue() throws Exception {
// TODO Auto-generated method stub
SAXReader reader = new SAXReader();
Document document = reader.read("src/person.xml");
Element root = document.getRootElement();
Element p1 = root.element("p1");
System.out.println(p1.attributeValue("id"));
}
32.使用dom4j支持xpath的操作
- /AAA/BBB/DDD:表示AAA下面的BBB下面的DDD
- //BBB:表示只要名称是BBB的
- //DDD/BBB:表示只要父元素是DDD的BBB元素
- *表示所有元素
- /AAA/CCC/DDD/*
- ⁄∗⁄∗⁄∗⁄BBB
- /AAA/BBB[1] :表示AAA下面的第一个BBB
- /AAA/BBB[last()]:表示AAA下面的最后一个BBB
-//BBB[@id]:表示有id属性的BBB
//BBB[@id=’b1’]:表示元素名称是BBB,并且在BBB上有id为b1的元素
- /AAA/BBB[last()]:表示AAA下面的最后一个BBB
33.使用dom4j支持xpath的具体操作
默认的情况下,dom4j不支持xpath
如果想要在dom4j里面支持xpath,需要引入支持xpath的jar包:jaxen-1.1-beta-6.jar
在dom4j里面提供了两个方法用来支持xpath
- selectNodes(“xpath表达式”):获取多个节点
- selectSingleNode(“xpath表达式”):获取一个节点