第20章JSP操作XML
20.1 XML简介
20.1.1 XML文档结构
- 1.序言
XML文档的序言中可以包括XML声明、处理指令和注释,但是3项不是必须的,如在上面的文档中就没有包括处理指令。
在XML文档中的第一行通常是XML声明,但不是必须的
<?xml version="version" encoding="value" standalone="value"?>
- version用于指定遵循XML规范的版本号。
- encoding用于指定XML文档中字符使用的编码集。常用的编码集有GBK、UTF-8等
- standalone 用于指定该XML文档是否和一个外部文档嵌套使用。取值为yes或no
- 2.文档元素
文档元素由起始标记、元素内容和结束标记3部分组成
<TagName>content</TagName>
- <TagName>,XML文档元素的起始标记,命名规则如下
- 元素的名称可以包含字母、数字和其他符号,但是最好不要使用"-"和".",以免产生混淆
- 元素的名称只能以字母、下划线或者冒号开头
- 元素名称不能以XML(XML、Xml、xML)开头
- 元素名称中不能包含空格
- 元素的名称不能为空
- content 元素内容
- </TagName> XML元素文档的结束标记,结束标记必须和开始标记一样
20.1.2 XML语法要求
- XML文档必须有一个顶层元素,其他元素必须嵌入在顶层元素中。
- 元素嵌套要正确,不允许元素间相互重叠或跨越。
- 每一个元素必须同时拥有起始标记和结束标记u这点与HTML不同,XML不允许忽略结束标记。
- 起始标记中的元素类型名必须与相应结束标记中的名称完全匹配。
- XML元素类型名区分大小写,而且幵始和结束标记必须准确匹配。例如,分别定义起始标记<Title>、结束标记,由于起始标记的类型名与结束标记的类型名不匹配,说明元素是非法的。
- 元素类型名称中可以包含字母、数字以及其他字母元素类型,也可以使用非英文字符,但不能以数字或符号开头,同时也不能包含空格符和冒号“:”。
- 元素可以包含属性,但属性值必须用单引号或双引号括起来(前后两个引号必须一致,不能一个是单引号,一个是双引号)。在一个元素节点中,性名不能重复。
20.1.3 为XML文档中的元素定义属性
20.1.4 XML的注释
<!--我是注释-->
20.1.5 处理字符数据
- 1.使用实体引用
实体引用,即是特殊字符串转义
常用的实体引用
字符 | 实体引用 |
---|---|
< 小于 |
< |
> 大于 |
> |
& 和 |
& |
' 单引号 |
' |
" 双引号 |
" |
- 2.使用CDATA段
CDATA段是一种用来包含文本的方法,其内部的所有内容都会被XML解析器当作普通文本,所以任何符号都不会被认为是标记符,在CDATA标记下实体引用都将失去作用
<![CDATA[文本内容]]>
20.2 dom4j概述
20.2.1 dom4j简介
dom4j是用于操作XML文档,如创建XML文档和解析XML文档
20.2.2 dom4j的下载与配置
将dom4j-1.6.1.jar
和jaxen-1.1-beta-6.jar
导入lib中
20.3 创建XML文档
20.3.1 创建XML文档对象
Document document=DocumentHelper.createDocument();
DocumentHelper类保存在org.dom4j包中
20.3.2 创建根节点
Document document=DocumentHelper.createDocument();//创建XML文档对象
Element element=DocumentHelper.createElement();//创建普通节点
document.setRootElement(element);//将element设置为根节点
20.3.3 添加注释
Document document=DocumentHelper.createDocument();//创建XML文档对象
Element element=DocumentHelper.createElement();//创建普通节点
document.setRootElement(element);//将element设置为根节点
element.addComment("这是根节点"); //添加注释
20.3.4 添加属性
Document document=DocumentHelper.createDocument();//创建XML文档对象
Element element=DocumentHelper.createElement();//创建普通节点
document.setRootElement(element);//将element设置为根节点
element.addAttribute("version","2.0");//添加属性
20.3.5 创建子节点
Document document=DocumentHelper.createDocument();//创建XML文档对象
Element element=DocumentHelper.createElement("placard");//创建普通节点
document.setRootElement(element);//将element设置为根节点
Element desc=element.addElement("description");//创建子节点 description
20.3.6 设置节点内容
- 1.使用普通文本作为节点内容
Document document=DocumentHelper.createDocument();//创建XML文档对象
Element element=DocumentHelper.createElement("placard");//创建普通节点
document.setRootElement(element);//将element设置为根节点
Element desc=element.addElement("description");//创建子节点 description
desc.setText("公告栏"); //设置子节点内容
- 2.将CDATA节点作为节点内容
Element content_item=element.addElement("content");//创建子节点
content_item.addCDATA("心中的鹅软石&童年的梦"); //设置子节点内容
20.3.7 设置编码
OutputFormat format=new OutputFormat(); //创建 OutputFormat对象
format.setEncoding("GBK"); //设置写入流编码为GBK
应用上面的代码,生成后的xml为
<?xml version="1.0" encoding="GBK" ?>
20.3.8 设置输出格式
dom4j默认生成XML采用紧凑格式排版。这种排版格式比较混乱,不容易阅读。使用createPrettyPrient()方法可以将XML文件格式化为缩进方式
OutputFormat format=OutputFormat.createPrettyPrint(); //格式化为缩进方式
20.3.9 输出XML文档
- 1.未设置输出格式
String fileURL=request.getRealPath("xml/placard.xml");
XMLWriter writer=new XMLWriter(new FileWriter(fileURL)); //实例化 XMLWriter对象
writer.write(document); //向流写入数据
writer.close(); //关闭 XMLWriter
- 2.已经设置了输出格式或编码集
OutputFormat format=new OutputFormat(); //创建 OutputFormat对象
format.setEncoding("GBK"); // 设置写入流编码
String fileURL=request.getRealPath("xml/placard.xml"); //
XMLWriter writer=new XMLWriter(new FileWriter(fileURL),format); //实例化 XMLWriter对象
writer.write(document); //向流写入数据
writer.close(); //关闭 XMLWriter
20.4 解析XML文档
20.4.1 构建XML文档对象
String fileURL=request.getRealPath("xml/placard.xml");
SAXReader reader=new SAXReader(); //实例化 SAXReader对象
Document document=reader.read(new File(fileURL)); //获取XML文件对应的XML文档对象
20.4.2 获取根节点
Edocument element=document.getRootElement(); //获取根节点
20.4.3 获取子节点
20.5 修改XML文档
20.5.1 修改节点
20.5.2 删除节点
删除XML文档的根节点placard的ID属性值为1的子节点info的代码如下
Element item=placard.selectSingleNode("/placard/info[@id='1']"); //获取要删除的节点
if(item!=null){
placard.remove(item); //删除指定的节点
}
批量删指定的子节点
document.getRoorElement().elements("info").clear(); //删除全部的info节点
20.6 典型应用
20.6.1 创建图书信息,并显示到浏览器上
- 1.创建web项目,导入如下jar包
dom4j-1.6.1.jar
- 2.编写index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'MyJsp.jsp' starting page</title>
</head>
<body>
<jsp:forward page="BookServlet"></jsp:forward>
</body>
</html>
- 3.创建BookServlet.java继承HttpServlet
//导包省略
public class BookServlet extends HttpServlet {
private static final long serialVersionUID = -5565840336525362453L;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/xml");
// 创建Document对象
Document document = DocumentHelper.createDocument();
// 创建根节点
Element root = DocumentHelper.createElement("Book-info");
document.setRootElement(root);
// 创建图书节点
Element book1 = root.addElement("book");
book1.addAttribute("名称", "Java开发典型模块大全");
// 创建图书节点的子节点
Element book1_price = book1.addElement("价格");
book1_price.setText("79");
// 创建图书节点的子节点
Element book1_author = book1.addElement("作者");
book1_author.setText("明日科技");
// 创建图书节点
Element book2 = root.addElement("book");
book2.addAttribute("名称", "JAVA从入门到精通");
// 创建图书节点的子节点
Element book2_price = book2.addElement("价格");
book2_price.setText("59.8");
// 创建图书节点的子节点
Element book2_author = book2.addElement("作者");
book2_author.setText("明日科技");
// 获取输出流
OutputStream out = response.getOutputStream();
OutputFormat f=OutputFormat.createPrettyPrint();//美化输出
// 创建XMLWriter
XMLWriter xmlWriter = new XMLWriter(out,f);
// 写出xml文档
xmlWriter.write(document);
xmlWriter.flush();
xmlWriter.close();
}
}
- 4.配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>BookServlet</servlet-name>
<servlet-class>com.lyq.servlet.BookServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>BookServlet</servlet-name>
<url-pattern>/BookServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- 5.程序部署运行后,浏览器输出如下
<?xml version="1.0" encoding="UTF-8"?>
<Book-info>
<book 名称="Java开发典型模块大全">
<价格>79</价格>
<作者>明日科技</作者>
</book>
<book 名称="JAVA从入门到精通">
<价格>59.8</价格>
<作者>明日科技</作者>
</book>
</Book-info>