背景
W3C :World Wilde Web Consortium 万维网联盟\W3C理事会
定义: 国际的标准化组织。 |
工作: 发展Web规范 |
Web规范:描述Web的通信协议 (HTML和XHTML) 和其他的构建模块 |
标记:
程序性标记:描述文档显示的样式 |
描述性标记:描述文档文字的用途 |
SGML:标准通用标记语言-Standard Generalized Markup Language
即:通用标言
定义: 定义电子文档结构和描述其内容的国际标准语言 |
基本思想:文档与样式的分离 |
派生: 1.XML 可扩展标记语言 数据 传输、储存 2.HTML超文本标记语言 数据 显示 |
XML语言
XML : eXtensible Markup Language 可扩展标记语言
一、简介
1可扩标言
定义:用于标记电子文件使其具有结构性的标记语言。
|
用途:传输数据、存储数据 即:一个独立于软件和硬件的信息传输工具 |
优势:数据搜索: 提取任何位置数据 数据显示:数据的结构和显示分离 数据交换:解析器-(跨平台、跨操作系统、跨域的数据交互)。 |
2数据结构:树状结构(层次结构数据模型)
3开发和应用环境
XML编译工具 XML验证工具 MircosoftXML Validator\MircosoftXSL Debugger XML解析器 DOM4j XML浏览工具 |
二、文档组成
文档构成
一、XML序文 |
1文档声明 version规范 encoding字符编码 standalone 外部DTD <?xml version=1.0’’> |
文档类型声明 DOCTYPE <!DOCTYPE 根元素标记名[<!—实体声明-->] > |
2文档注释 <!—注释内容--> |
3处理指令 type类型 href连接 <!—注释内容--> |
二、文档元素 |
根元素: 完全包括文档中其他所有元素的元素 普通元素: 属性 |
元素文档树 |
文档内容
1元素TITLE
<开始标记>内容</结束标记> < TITLE >YIKEJI.LTD</TITLE> |
元素之间的关系:子元素/父元素、祖先/后代 |
元素内容的关系:嵌套元素/字符数据/实体引用/CDATA节/处理指令/注释 |
2属性ATTRIBUTE
<元素名 属性名=”属性值”> |
3实体
作用:避免重复输入 |
预定义实体: |
自定义实体: <!DOCTYPE 根元素 [<!ENTITY 实体名“实体内容”>]> |
引用已定义的实体: &实体名 |
4专用标记
1注释: <!—注释--> |
2处理指令PI :XML解析器传递信息到应用程序 语法: 样式表处理指令 |
3CDATA节点:整段文本解释为纯字符数据而不是标记。 语法:<![CDATA[<html><head></head></html>]]> |
5命名空间 Namespace
命名冲突:不同文档使用同样的名称描述两个不同类型的元素。 解决冲突问题: 1使用前缀 <h:table><f:table> 2使用命名空间 <h:table xmlns:h=“”> <f:table xmlns: f=” ”> <f:name>African Coffee Table</f:name> |
三、语法规则
声明
元素:
元素:XML的标签 包括:开始标签+结束标签 |
书写: 包含标签体\不含标签体 |
说明: 1个根标签 2空格和换行 |
命名规范: 可以含字母、数字以及其他的字符 不能以字符 “xml”(或者 XML、Xml)开始 不能包含空格 |
四、解析
1解析方式 :DOM\SAX\JDOM\DOM4J
1DOM解析:DOM4J(DOM For Java)实现DOM解析 |
2SAX解析: pull解析和Sax类似 |
2区别
DOM解析(Document Object Model) 文档对象模型 所有的XML文档信息存于内存中, 创建DOM树 效率低、解析慢 内存消耗大、支持增删改查、 |
SAX解析(Simple API for XML) 用与处理XML事件驱动的“推”模型 效率高、解析快 内存消耗小、只适合读取、 |
6.1 DOM4J解析
Dom4j :是一个为Java服务的XML框架。
可以对XML文档读写、操作、创建和修改,集成了DOM和SAX,同样支持xPath
1获取Document对象 SAXReader reader = new SAXReader(); |
2节点对象操作 1.获取根节点. Element root = document.getRootElement(); |
节点属性操作 1.获取根节点 Element root=document.getRootElement(); |
DOM4J
内容
1接口 |
Document接口: XML文档 |
Element接口: XML元素 |
Attribute接口: XML元素的属性节点 |
Text文本节点 |
Branch: 为所有节点定义的公共行为 |
NodeL节点: 属性节点、文本节点等 |
2工具类 |
DocumentHelper: |
OutputFormat |
XMLWriter |
SAXReader |
操作
生成文档 |
第一步:在内存中生成一个XML文档的Document |
第二步:将Document输出到文件 |
解析文档 |
SAXReader reader=new SAXReader(); Document doc= read.read(getClass().getResourceAsStream(“/com/qfedu/dom4j/book.xml”)) Element root=doc.getRootElement();
For() |
案例1 读取
1创建SaxReader SAXReader reader = new SAXReader(); 2获取Document对象 Document document = reader.reader(new FileReader(“src\\book.xml”)); 3获取根节点 Element root = document.getRootElement(); 4获取book集合 List<Element> bookList=root.elements(“book”); for(Element b:bookList){ 5获取属性 String id=b.attributeValue("id"); Book book=new Book(Integer.parseInt(id), name, author,Double.parseDouble(price)); } |
public static void readxml() throws Exception{
//1创建SaxReader
SAXReader reader=new SAXReader();
//2获取Document对象
Document document=reader.read(new FileReader("src\\books2.xml"));
//3获取根节点
Element root=document.getRootElement();//books
//System.out.println(root.getName());
//4获取book集合
List<Element> bookList=root.elements("book");
for (Element b : bookList) {
//System.out.println(b.getName());
//5获取属性
String id=b.attributeValue("id");
String name=b.element("name").getText();
String author=b.element("author").getText();
String price=b.elementText("price");
Book book=new Book(Integer.parseInt(id), name, author, Double.parseDouble(price));
System.out.println(book.toString());
}
}
案例2 写入
1创建SaxReader :SAXReader reader = new SAXReader(); 2读取文件 : Document document = reader.read(FileReader(“src\\book.xml”)); 3获取根节点: Element root = document.getRootElement(); 4添加元素 Element newbook = root.addElement(“book”); 5添加属性 newbook.addAttribute(“id”,”1003”); 6 添加子元素 newbook.addElement("name").setText("android开发");; 7写入文件 OutputFormat format=OutputFormat.createPrettyPrint(); 设置编码格式 format.setEncoding("utf-8"); 创建写入流 XMLWriter writer=new XMLWriter( new FileWriter("src\\books2.xml"), format); 关闭写入流 writer.close(); |
//2写入xml文件
public static void writeXml() throws Exception{
//1 创建SaxReader
SAXReader reader=new SAXReader();
//2读取
Document document=reader.read(new FileReader("src\\books2.xml"));
//3获取根节点
Element root = document.getRootElement();
//4添加节点
Element newbook = root.addElement("book");
//5添加属性
newbook.addAttribute("id","1003");
//6newbook添加name author price
newbook.addElement("name").setText("android开发");;
newbook.addElement("author").setText("老张");;
newbook.addElement("price").setText("88.8");
//7写入文件中
OutputFormat format=OutputFormat.createPrettyPrint();//创建一个漂亮的输出格式
format.setEncoding("utf-8");
XMLWriter writer=new XMLWriter(new FileWriter("src\\books2.xml"), format);
writer.write(document);
writer.close();
System.out.println("写入成功");
}
案例3 修改和删除
1创建Xml SAXReader reader = new SAXReader(); 2读取文档 Document document = reader.read(new FileReader(“src\\book.xml”)); 3获取根节点 Element root = document.getRootElement(): 4获取元素 List<Element> elements = root.elements(“book”); Element bookElement = elements.get(2); bookEle.element(“name”).setText(“新书名”); 5删除 Element delEle= elements.get(0); root.remove(delEle); 6写入 OutputFormat format = Output.createPrettyPrint(); 设置编码格式 Format.setEncoding(“utf-8”); 创建写入流 XMLWriter writer=new XMLWriter( new FileWriter("src\\books2.xml"), format); 写入文件 writer.write(document);
|
public static void updateXml() throws Exception{
//1创建Xmlreader
SAXReader reader=new SAXReader();
//2文档
Document document = reader.read(new FileReader("src\\books2.xml"));
//3获取根节点
Element root = document.getRootElement();
//4获取id=1003的book
List<Element> elements = root.elements("book");
Element bookEle = elements.get(2);
bookEle.element("name").setText("android从入门到大神");
Element first =elements.get(0);
//5删除
root.remove(first);
//6写入
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer=new XMLWriter(new FileWriter("src\\books2.xml"), format);
writer.write(document);
writer.close();
System.out.println("修改删除完毕");
}