XML:可扩展标记语言
作用:用来存储有关系的数据,做配置文件(可提高系统的灵活性,描述模块与模块之间的关系)
可自定义标签。一个标签包括开始标签和结束标签,
开始和结束标签之间又可以使用其他标签
Xml:
文档声明<?Xml version="1.0" ?>(最简单文档声明),没有文档声明的XML是格式不良好的文档
<?Xml version="1.0" encoding="UTF-8" ?>
Standalone="yes"//是否依赖其他文档
空格和换行也是XML内容。
标签属性可以跟在标签后,也可以以子元素形式。
<!-- -->注释,注释不能嵌套
CDATA区:
Xml中不需要解析的内容,可以放在CDATA区
<![CDATA[
...........
]]>
转义字符:
用来显示单个字符的原始样式,不会被解析
&(&),<(<),>(>),"("),'(&quos;)后面要跟分号
处理指令:
用来指导引擎解析XML
Xml-stylesheet可指定引擎用什么样式来显示XML
<?Xml-stylesheet type="text/css" href="1.css" ?>
XML约束:( 要能读懂约束)
DTD约束:
约束可写在一个单独的文件中,也可以直接写在XML中
约束中如果有中文,编码要指定为utf-8或unicode
引入约束<!DOCTYPE 书架 SYSTEM "book.dtd">
文件清单:book.dtd
<!ELEMENT 书架 (书+)>// 书架中可有多本书
<!ELEMENT 书 (书名,作者,售价)>//声明书的属性
<!ELEMENT 书名 (#PCDATA)>//PCDATA代表中间可写字符串
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
元素定义:参考PPT
<!Element 名称 类型或内容(如果是内容,要用括号)>
属性定义:
<!ATTLIST元素名
属性名1 属性值类型 设置说明
属性名2 属性值类型 设置说明
>
约束的引入:
当引用的文件在本地时,采用如下方式:
<!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">
例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。在xml文件中手写一下。
当引用的文件是一个公共的文件时,采用如下方式:
<!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">
例如:<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
Javacript校对XML:
创建xml文档解析器对象
var xmldoc = new ActiveXObject("Microsoft.XMLDOM");
开启xml校验
xmldoc.validateOnParse = "true";
装载xml文档
xmldoc.load("book.xml");
获取错误信息
xmldoc.parseError.reason;
xmldoc.parseError.line
XML编程:
XML解析:dom和sax
Dom:一次装载整个文档,把所有节点(Node)变成对象
Node.type类型(Element,Attribute)
Crud 操作,拿到父节点
特点:
会把整个文档装载到内存中,并把文档的每一部分内容都变成一个对象,并按照文档结构建立起对象关系
CRUD操作方便
缺点:如果XML文档很大,内存占用量大,可能内存溢出。(虚拟机缺省值64M)
修改虚拟机内存: dialog----可变参数--- -Xmx500m
Sax:
读一行,解析一行。(速度快,内存消耗低)
但不能修改文档。
特点:
边解析变执行,内存消耗很少,并且解析速度很快;
缺点:
不能做文档的增删改。
XML解析开发包:
Jaxp (SUN),dom ,dom4j(dom4j最优秀)
Jaxp:(可参考JDK文档)day2----day3
是J2SE的一部分
Jaxp dom:
DocumentBuilderFactory.newInstace()//获得解析器工厂
newDocumentBuilder()获得解析器
修改后的XML数据跟新到XML中要用transformer
TransformerFactory.newInstance().newTanstormer().tansform(new DomSource(document),new StreamResult(new File("src/book.xml")));
Jaxp Sax:
采用事件处理的方式解析。没解析到一个组成部分,就调用事件处理器的一个方法,并把数据传给解析器
内容事件处理器:ContentHandler
SAXParserFactory.newInstace().newSAXParser().getXMLReader();
reader.setContentHandler(new MyHandler());(处理器要实现contenHandler接口或继承defaultHandler 默认实现类)
Reader.parse("src/book.xml");
ContentHandler的API:
Characters();
startElement();
endElement();
startDocument();
endDocument();
Dom4j:
导包:如果一个不行,就导入lib里的所有包。
参考文档。
document.getRootElement().element(“书名”)//第一个子节点
document.getRootElement().elements("书名").get(2);第二个子节点
.attributeValue("name");获得属性的值
更新到XML中:
XMLWriter writer=new XMLWriter(new OutputStreamWriter(new FileOutputStream("src/book.xml"),"UTF-8"));
Writer.wirte(document);
Wirter.closd();
也可通过格式化输出器,指定码表
Xpath: (参考XPATH中文文档)
方便提取XML数据
可配合DOM4J用来取XML数据,具体参考文档案例
Xml约束:
Schema: .xsd
Schema符合XML语法结构(也是XML文件)
支持更多数据类型,支持自定义数据类型。
不能定义实体
根节点是 schema
编写好的约束会绑定一个URI,编写XML时可以引入名称空间,来约束XML