JavaWeb
来源:互联网 发布:天互数据 图片 编辑:程序博客网 时间:2024/05/19 01:33
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表达式”):获取一个节点
- javaweb
- JavaWeb
- JavaWeb
- javaweb
- javaWeb
- JAVAweb
- 【JavaWeb】
- javaweb
- javaweb
- javaweb
- javaweb
- javaWeb
- javaweb
- javaweb
- JavaWEB
- JavaWeb
- javaweb
- JavaWeb
- 准大四实习找工作小纪
- CSDN.1
- 绘制各种图形
- 理解Tomcat
- 最新面试题
- JavaWeb
- 常用加解密算法总结1-DES、TDES、3DES
- 2017南宁网络赛L.The Heaviest Non-decreasing Subsequence Problem (最长非递减子序列)
- MySQL模糊查询使用INSTR替代LIKE
- 太上感应篇0020
- 结合《docker进阶与实战中》中的例子理解overlayFS
- opencv 数据结构
- ubuntu vscode latex 中外语言支持
- 求出小于或等于lim的所有素数并放在aa数组中, 函数返回所求出的素数的个数。C语言编写【20题】