文档版本 | 开发工具 | 测试平台 | 工程名字 | 日期 | 作者 | 备注 |
---|---|---|---|---|---|---|
V1.0 | 2016.04.17 | lutianfei | none |
XML Schema 也是一种用于定义和描述 XML 文档结构与内容的模式语言,其出现是为了克服 DTD 的局限性。
schema和DTD的对比(面试题):
名称空间
支持得非常好。.xsd
和XML文件一样,一个XML Schema文档也必须有一个根结点,但这个根结点的名称为schema
应用schema约束 开发xml 过程
URI地
址上,这个URI地址叫namespace名称空间
,以后XML文件就可以通过这个URI(即名称空间)引用绑定指定名称空间的元素。开发schema约束文档
根节点
上,使用属性xmlns
(xml namespace) xmlns="http://www.w3.org/2001/XMLSchema"
<element name="书架"></element>
type="数据的类型"
<complexType>
<sequence>
targetNamespace
目标名称空间 http://www.itcast.cn/1110
在XML文档中引入自己编写的schema文档
xmlns="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/1110"
schemaLocation
属性是W3C提供的,如果W3C名称空间要是有别名的话,先把别名写上。xsi:schemaLocation="名称空间 schema文件的地址"
<attribute name="出版社" type="string" use="required" ></attribute>
// schema 文件:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn/1110" elementFormDefault="qualified">
<!-- 复杂元素 -->
<element name="书架">
<!-- 复杂元素 -->
<complexType>
<!-- 有顺序的 -->
<sequence maxOccurs="unbounded">
<element name="书">
<!-- 复杂的元素 -->
<complexType>
<!-- 有顺序的 -->
<sequence>
<!-- 简单元素 -->
<element name="书名" type="string"></element>
<element name="作者" type="string"></element>
<element name="售价" type="double"></element>
<element name="简介" type="string"></element>
</sequence>
<!-- 书的属性 -->
<attribute name="出版社" type="string" use="required" ></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
// xml 文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.itcast.cn/1110" xsi:schemaLocation="http://www.itcast.cn/1110 book.xsd" >
<书 出版社="清华出版社">
<书名>javaweb开发大全</书名>
<作者>班长</作者>
<售价>99.8</售价>
<简介>这是不错啊</简介>
</书>
<书 出版社="清华出版社">
<书名>javaweb开发大全</书名>
<作者>班长</作者>
<售价>99.8</售价>
<简介>这是不错啊</简介>
</书>
<书 出版社="清华出版社">
<书名>javaweb开发大全</书名>
<作者>班长</作者>
<售价>99.8</售价>
<简介>这是不错啊</简介>
</书>
</书架>
URI
(Uniform Resource Identifier,统一资源标识符)表示。 <itcast:书架 xmlns:itcast=“http://www.itcast.cn”>
<itcast:书>……</itcast:书>
</itcast:书架>
此处使用itcast来指向声明的名称,以便于后面对名称空间的引用。
注意:名称空间的名字语法容易让人混淆,尽管以 http:// 开始,那个 URL** 并不指向一个包含模式定义的文件**。事实上,这个 URL:http://www.itcast.cn
根本没有指向任何文件,只是一个分配的名字。
schemaLocation
属性来指定,例如: <itcast:书架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
只能做查询,不能做增删改。
SAX解析过程
SAX的解析原理:
package cn.itcast.jaxp.sax;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/** * SAX的入门 * @author Administrator * */
public class JaxpSaxTest {
public static void main(String[] args) {
try {
run1();
} catch (Exception e) {
e.printStackTrace();
}
}
/** * 获取所有的解析的内容 * @throws Exception * @throws ParserConfigurationException */
public static void run1() throws Exception{
// 获取SAX的解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
// 获取解析器
SAXParser parser = factory.newSAXParser();
// 解析
parser.parse("src/book2.xml", new MyHandler2());
}
}
/** * 获取作者标签的文本内容 * */
class MyHandler2 extends DefaultHandler{
// 如果解析到作者标签的时候,flag设置成true
private boolean flag = false;
private int count = 0;
/** * 默认解析开始标签,默认调用该方法 */
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// 如果要是作者标签,flag设置成true
if("作者".equals(qName)){
flag = true;
count++;
}
}
/** * 能控制characters的输出,我只在解析作者标签的时候,才打印 */
public void characters(char[] ch, int start, int length)
throws SAXException {
// 如果flag是true,就打印
// 每一次都打印
if(flag && count == 1){
String str = new String(ch,start,length);
System.out.println(str);
}
}
/** * */
public void endElement(String uri, String localName, String qName)
throws SAXException {
// flag恢复成false
flag = false;
}
}
/** * 自己事件处理器 * 重写三方法 * @author Administrator * */
class MyHandler extends DefaultHandler{
/** * 只要一解析到开始标签的时候,默认调用该方法,把解析的内容赋值给参数。 */
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("开始标签:"+qName);
}
/** * 只要解析到文本的内容,默认调用该方法 */
public void characters(char[] ch, int start, int length)
throws SAXException {
String str = new String(ch,start,length);
System.out.println(str);
}
/** * 解析到结束标签的时候,默认调用方法,把解析的内容赋值给参数。 */
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("结束标签:"+qName);
}
}
dom4j-1.6.1.jar
导入到工程中。奶瓶
标志,点中jar包右键选择:Build path –> Add to Build Path。修改指定节点的文本内容
删除节点
jaxen-1.1-beta-6.jar
使用方式:
selectNodes("/AAA")
返回集合selectSingleNode()
一个Node对象/AAA/BBB
获取BBB的节点//BBB
无论层级关系,找到BBB的节点*
代表是所有/AAA/BBB[1]
找到BBB的第一个 /AAA/BBB[last()]
最后一个@
属性DOM4J练习
package cn.itcast.dom4j;
import java.io.FileOutputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/** * DOM4J的解析XML * @author Administrator * */
public class Dom4jTest {
public static void main(String[] args) {
try {
run6();
} catch (Exception e) {
e.printStackTrace();
}
}
/** * 对XPATH的支持 * @throws Exception */
public static void run6() throws Exception{
// 获取解析器对象
SAXReader reader = new SAXReader();
// 解析XML
Document document = reader.read("src/book2.xml");
// List<Node> list = document.selectNodes("/书架/书/作者");
List<Node> list = document.selectNodes("//作者");
Node author2 = list.get(1);
System.out.println(author2.getText());
}
/** * 修改文本内容 * @throws Exception */
public static void run5() throws Exception{
// 获取解析器对象
SAXReader reader = new SAXReader();
// 解析XML
Document document = reader.read("src/book2.xml");
// 获取根节点
Element root = document.getRootElement();
// 获取狗的节点
Element book2 = (Element) root.elements("书").get(1);
Element dog = book2.element("狗");
dog.setText("小狗");
// 回写
// 回写
OutputFormat format = OutputFormat.createPrettyPrint();
// 回写
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
writer.write(document);
writer.close();
}
/** * 删除子节点 * 删除第二本书下的猫节点 */
public static void run4() throws Exception{
// 获取解析器对象
SAXReader reader = new SAXReader();
// 解析XML
Document document = reader.read("src/book2.xml");
// 获取根节点
Element root = document.getRootElement();
// 获取猫
Element book2 = (Element) root.elements("书").get(1);
Element cat = book2.element("猫");
// 通过猫获取猫的父节点
// cat.getParent();
// 通过父节点删除猫
book2.remove(cat);
// 回写
OutputFormat format = OutputFormat.createPrettyPrint();
// 回写
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
writer.write(document);
writer.close();
}
/** * 在第二本书的作者标签之前添加团购价的标签 * @throws Exception */
public static void run3() throws Exception{
// List
// 获取解析器对象
SAXReader reader = new SAXReader();
// 解析XML
Document document = reader.read("src/book2.xml");
// 获取根节点
Element root = document.getRootElement();
// 获取第二本书
Element book2 = (Element) root.elements("书").get(1);
// 获取书下的所有子节点,返回List集合
List<Element> list = book2.elements();
// 创建元素对象 DocumentHelper.createElement("狗")
Element dog = DocumentHelper.createElement("狗");
dog.setText("大狗");
// list.add(index,Element);
list.add(1, dog);
OutputFormat format = OutputFormat.createPrettyPrint();
// 回写
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
writer.write(document);
writer.close();
}
/** * 在第二本书下添加子节点 */
public static void run2() throws Exception{
// 获取解析器对象
SAXReader reader = new SAXReader();
// 解析XML,返回Document对象
Document document = reader.read("src/book2.xml");
// 获取根节点
Element root = document.getRootElement();
// 获取第二本书
Element book2 = (Element) root.elements("书").get(1);
// 可以直接在第二本书下添加子节点,设置文本内容
book2.addElement("猫").setText("我是猫");
// 回写
// 创建漂亮的格式
OutputFormat format = OutputFormat.createPrettyPrint();
//OutputFormat format = OutputFormat.createCompactFormat();
// 设置编码
format.setEncoding("UTF-8");
// 回写类
XMLWriter writer = new XMLWriter(new FileOutputStream("src/book2.xml"),format);
// 回写了文档对象
writer.write(document);
// 关闭流
writer.close();
}
/** * 获取第二本书作者的文本内容 * @throws Exception */
public static void run1() throws Exception{
// 获取解析器对象
SAXReader reader = new SAXReader();
// 解析XML,返回Document对象
Document document = reader.read("src/book2.xml");
// 获取根节点(书架标签)
Element root = document.getRootElement();
// 获取书的节点,获取第二本书
List<Element> books = root.elements("书");
Element book2 = books.get(1);
// 获取作者的标签
Element author2 = book2.element("作者");
// 获取文本内容
System.out.println(author2.getText());
}
}