一、XML语法:
一个XML文档包含一下部分:
文档声明:<?xml version="1.0" encoding="GB2312" ?>
元素: XML中出现的标签,只有一个根标签!其它的都是子孙标签!!
最好不要带空格和回车,否则这也会被记录起来!正确代码:<网址>www.itcast.cn</网址>
属性: 一个标签可以有多个属性,例如:<input name=“text”>
注释: 注释不能嵌套。 <!--注释内容-->
CDATA区: 编写的XML文件,有些内容不想让解析引擎解析执行,当成原始数据处理(直接输出)
,把这些内容放在CDATA中。例如:
<![CDATA[
<itcast>
<br/>
</itcast>
]]>
特殊字符: 你懂的!哈哈! 只有五个。
枚举法:
& -->&
< --><
> -->>
“ -->"
‘ -->'
处理指令:PI,指挥解析引擎如何解析XML文档内容!例如:
<?xml-stylesheet type=”text/css" href="1.css" ?> 通知XML解析引擎,应该用css文件显示xml文档内容!
处理指令的格式是 <? 开头, ?> 结尾! XML声明语句是最常见的处理指令!
二、XML约束
1.解析XML文档的解析器叫做parser, 只有遵循约束的文档才叫做有效的!
2.约束就是编写一个文档约束一个XML的书写规范就叫做XML约束!
3.约束规定了XML的元素名字,属性,以及顺序!
4.我们常用的约束是 XML DTD 约束 和XML Schema(这个约束更为严格,等会是肯定有比较的!)
5.DTD约束称为 文档类型定义(Document Type Definition) !可以参考PPT中的范例看看!
6.校验XML文档的正确性!有一个小工具,参考PPT中的测试方法!
7.DTD的约束两种约束方式: 单独编写 和 在XML中编写!
8.使用DOCTYPE 声明语句的两种形式:
引用本地的,例如:<!DOCTYPE 书架 SYSTEM “book.dtd”>
引用公共的,例如:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
9.DTD约束语法细节
01.元素定义: <!ELEMENT 元素名称 元素类型>
元素类型可以是元素内容或类型
如果是内容用括号,
是类型,直接写!
<!ELEMENT 书架 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
只有两种类型: EMPTY:定义为空元素
ANY:任意类型!
1) <!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)> 用逗号分隔,表示内容的出现顺序必须与声明时一致!
2) <!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)> 用 | 隔开,表示任选其一 ,即多个只能出现一次!
3) 在元素内容中也可以使用 +,* ,? 等符号表示元素出现的次数!
用圆括号() +:一次或者多次(书+)
?:0次或者一次 (书?)
* :0次或者多批量设置,例如:<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
02.属性定义: XML文档中的标签属性需通过ATTLIST为其设置属性
语法: <!ATTLIST 元素名 例子: 对应XML文件:
属性名1 属性类型 设置说明 <!ATTLIST 商品 <商品 类别="服装" 颜色="黄色">…</商品>
属性名1 属性类型 设置说明 类别 CDATA #REQUIRED <商品 类别="服装">…</商品>
颜色 CDATA #IMPLIED
.........
> >
属性的设置好说明: #REQUIRED 是必须设置的属性
#IMPLIED 是可以设置也可以不设置
#FIXED 是设置一个固定的值
直接使用默任值 可设置也可以不设置,如果没有设置就使用默认值!
举例说明:
<!ATTLIST 页面作者
姓名 CDATA #IMPLIED
年龄 CDATA #IMPLIED
联系信息 CDATA #REQUIRED
网站职务 CDATA #FIXED "页面作者"
个人爱好 CDATA "上网"
>
常用属性值类型:
CDATA:表示属性值为普通文本字符串
ENUMERATED:(DTD中没有此关键字) 枚举,只能选择一个!
示例:
<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 购物篮 [
<!ELEMENT 肉 EMPTY>
<!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
]>
<购物篮>
<肉 品种="鱼肉"/>
<肉 品种="牛肉"/>
<肉/>
</购物篮>
ID: 属性的设置值为唯一的一个值, ID属性的值只能由字母,下划线开始,不能出现空白字符,如果是数字那就错了,你做好再验证一下!<参考PPT吧!>
ENTITY(实体):实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了!
在DTD中定义用<!ENTITY> 定义实体!
实体分为两种类型:引用实体和参数实体!
03.实体定义:
引用实体: 在XML文档中被应用。
<!ENTITY 实体名称 “实体内容”>:直接转变成实体内容
引用方式: &实体名称;
举例:
<!ENTITY copyright "I am a programmer">
......
©rigth;
<?可以吗?,查查!>另一种方式:<!ENTITY 实体名称 SYSTEM “外部XML文档的URL” >:用一个文档所实体
参数实体: 参数实体被DTD文件自身使用。
<!ENTITY % 实体名称 “实体内容”> (其实就是比引用实体多了一个百分号而已!)
引用方式: %实体名称;
例子:
<!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
<!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>
<!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>
举例2:
<!ENTITY % common.attributes
" id ID #IMPLIED
account CDATA #REQUIRED "
>
...
<!ATTLIST purchaseOrder %common.attributes;>
<!ATTLIST item %common.attributes;>
三、 XML 编程(CRUD)
XML解析方式分为:dom 和 Sax ,XML解析开发包:daxp,jdom,dom4j.
1.JAXP: 程序员调用javax.xml.parsers包中的工厂类,可以得到对xml文档解析的DOM或SAX的解析对象!
包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,是一个工厂类,不能实例化,但可以newInstance()方法,
这个方法可以根据本地平台默认安装的解析器,自动创建一个工厂对象,并返回!
获得JAXP中的DOM解析器:
01.调用DocumentBuilderFactory.newInstance(),创建DOM解析器的工厂!
02.调用工厂对象的newDocumentBuilder方法得到DOM解析器对象。
03.调用DOM解析器的对象的parse()得到整个文档的Document对象,就可以利用DOM特性对整个XML文档进行操作了!
2.DOM模型:
DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
在DOM中,节点之间的关系:
01.位于一个节点之上的节点是该节点的父节点(parent)
02.同理,之下为子节点(children)
03.在同层次的节点是兄弟节点(sibling)
04.节点的下一个层次的节点集合是节点后代(descendants)
05.父、祖节点及所有节点上面的,都是节点的祖先(ancestors)
节点类型 Node对象
1.Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应节点的0对象(Node的子类对象)(不是很明白!对看看)
2.Node对象提供了相应的方法去获得它的父结点和子结点。
编程人员可以通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了具体修改方法!
(可以在API中看到,今天晚上一定要把这个练习练习!)
3.DOM方式解析XML文件
DOM解析编程:
01.遍历所有节点
02.得到某个具体节点内容
03.修改某个节点的内容
04.向指定节点中添加子节点
05.向指定点上添加同级节点
06.删除指定节点
07.操作XML文件属性
(对于以上这些知识,你必须打代码练习!)
4.更新XML文档
1.java.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换成某种格式后进行输出
,例如把xml文件用样式表转换成一个html文档,利用这个对象,当然也可以把Document对象又重新写入到XML文件中!
2.Transformer类通过transfrom方法完成转换操作,该方法接受一个源和一个目的地!
javax.xml.transform.dom.DOMSource 类来关联要转换的document对象。
用java.xml.transform.strean.StreamResult对象来表示数据的目的地
5.SAX解析
1.在使用DOM解析XML文档的时候,读取整个XML文档,在内存中构架代表整个DOM树的Document对象,然后对XML文档操作。如果
文档很大,就好消化计算机大量的内存!
2.SAX解析可以读取一部分解析一部分。
SAX采用 事件处理 的方式解析XML文件,利用SAX解析XML文档,涉及两个部分:
解析器和时间处理器:
01.用JAXP的API创建出SAX的解析器后可以解析XML文档
02.用SAX方式解析出XML的一部分时,都会调用事件处理器的一个方法。解析器调用方法时会把当前解析到的
XML文件内容的 作为 方法的参数 传递给事件处理器。
03.程序员编写事件处理器,可以轻松得到sax解析器解析的数据,可以对数据进行合适的处理
SAX解析: SAXParserFactory ---> SAXParser --> xml --> SAXReader
常用方法: startElement,endElement,characters
01.startElement(String uri, String localName, String qName, Attributes atts)
接收元素开始的通知。
02.endElement(String uri, String localName, String qName)
接收元素结束的通知。
03.characters(char[] ch, int start, int length)
接收字符数据的通知。
SAX方式解析XML文档:
SAXParserFactory spf = SAXParserFactory.newInstance(); 使用 SAXParserFactory创建SAX解析工厂
SAXParser sp = spf.newSAXParser(); 通过SAX解析工厂得到解析器对象
XMLReader xmlreader = sp.getXMLReader(); 通过解析器对象得到一个XML解析器
xmlReader.setContentHandler(new BOOKParserHandler()); 设置读取器的事件处理器
xmlReader.parser(""); 解析xml文件
public Document parse(File f)f - 包含要解析的 XML 的文件。
6.DOM4j解析XML文档
01.Dom4J使用接口和抽象基类,是开源代码库,API复杂,但比JDOM 更灵活!
02.Dom4j是非常优秀的Java XML API!
03.Dom4j需要下载Dom4j 相应的jar文件
Document 对象:
01.读取XML文件,获得document对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
02.解析XML形式的文本,得到document对象。
String text = "<members></members>";
Document document = DocumentHelper.parseText(text);
03.主动创建document对象。
Document document = DocumentHelper.createDocument();
//创建根节点
Element root = documentaddElement("members");
7.节点对象:
01.获取文档的根节点
Element root = document.getRootElement();
02.取得某个节点的子节点
Element element = node.element("书名");
03.取得节点的文字
String text = node.getText();
04.取得某个节点下所有名为“member”的子节点,并进行遍历
List nodes = rootElements("member");
for(Iterator it = nodes.iterator();it.hasNext();){
Element elm = (Element)it.next();
//do something
}
05.对某节点下的所有子节点进行遍历
for(Iterator it = root.elementIterator();it.hasNext();){
Element element = (Element)it.next();}
06.在某节点下添加子节点
Element ageElm = newMeMberElm.addElement("age");
07.设置节点文字。
element.setText("19");
08.删除节点
//childElm 是待删除的节点, parentElm 是其父节点
parentElm.remove(childElm);
09.添加一个CDATA节点
Element contentElm = infoElm.addElement("content");
contentElm.addCDATA(diary.getContent());
8.节点对象属性
1.取得某节点下的某个属性
Element root = document.getRootElement();
//属性名name
Attribute attribute = root.attribute("size");
2.取得属性的文字
Sting text = attribute.getText();
3.删除某 属性
Attribute attribute = root.attribute("size");
root.remove(attribute);
4.遍历某节点的所有属性
Element root = document.getRootElement();
for(Iterator it = attributelterator(); it.hasNext();){
Attribute attribute = (Attribute) it.next();
String text = attribute.getText();
System.out.println(text);
}
5.设置某节点的属性和文字
newMemberElm.addAttribute("name","sitinspring");
6.设置属性的文字
Attribute attribute = root.attirbute("name");
attribute.setText("sitinpring");
9.将文档写入XML文件
1.文档为英文,不用设置编码,直接写入的形式
XMLWrite writer = new XMLWriter(new FileWriter("output.xml"));
writer.writer(document);
writer.close();
2.文档包含中文,设置编码格式写入
OutputForMat format = OutputFormat.createPrettyPrint();
//指定XML编码
format.setEncoding("GBK");
XMLWriter writer = new XMLWriter(new FileOutputStream("output.xml",format);
writer.writer(document);
writer.close();
10. Dom4j 在指定位置插入节点
1.得到插入位置的节点列表(list)
2.调用list.add(index,element),由index决定Element的插入位置
3.Element元素可以通过DocumentHelper对象得到:
Element aaa = DocumentHelper.createElement("aaa");
aaa.setText("aaa");
List list = rootelement("书").elements();
list.add(1,aaa);
11. 字符串与XML的转换
1.将字符串转换成为XML
String text = "<members><member>sitinpring</member></members>"
Document document = DocumentHelper.parseText(text);
2.将文档或节点的XML转换为字符串
SAXReader reader = new SAXReader();
Document document = reader.read(new File("input.xml"));
Element root = document.getRootElemt();
String docXmlText = document.adXML();
String rootXmlText = root.asXML();
Element memberElm = root.element("member");
String memberXmlText= memberElm.adXML();
12. XMl Schema: 定义和描述XML文档的结构与内容的模式语言,其出现是为了克服DTD的局限性!
只说几方面吧:
1.XML Schema 符合XML语法结构
2.DOM,SAX 等XML API 很容易解析出 XML Schema 文档中的内容
3.XML Schema 对 名称空间 支持的很好
4.支持自定义新的数据类型
5.约束能力强大,可对XML实例文档作出细致的语义限制
6.XML逐渐取代DTD, 不能定义实体, 比DTD更复杂!
13.Schema约束快速入门:
1.XML Schema就是一个 XML文档,扩展名为:.xsd
2.一个XML Schema 文档就是 模式文档 (约束文档), 遵循这个文档的书写就是 实例文档!
3.XML Schema 文档也必须有一个根结点,但是这个根结点的名,叫做:Schema
4.编写XML Schema (约束文档)后, 把声明的元素 绑定到 URI (专业术语是 名称空间)地址上,XML文件可以通过 名称空间 告诉解析引擎,XML 编写的元素来自哪里,被谁约束!
Schema 入门案例:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www. itcast.cn"
elementFormDefault="qualified">
<xs:element name='书架' >
<xs:complexType>
<xs:sequence maxOccurs='unbounded' >
<xs:element name='书' >
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
自我感觉不是很懂!还是练练!
14.再一个更简单的例子:
<?xml version="1.0" encoding="UTF-8"?>
<itcast:书架 xmlns:itcast="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
<itcast:书>
<itcast:书名>JavaScript网页开发</itcast:书名>
<itcast:作者>张孝祥</itcast:作者>
<itcast:售价>28.00元</itcast:售价>
</itcast:书>
</itcast:书架>
15.名称空间的概念
在XML Schema 中,每个约束的文档都可以被赋予 唯一的 名称空间 ,名称空间用一个唯一的URI(统一资源标识符)表示。在XML文件中,标签 可以通过 名称空间声明 表示,
来声明当前编写的标签来自那个Schema约束文件:
例如:
<itcast: 书架 xml:itcast = "http://www.itcast.cn">
<itcast:书>........</itcast:书>
</itcast:书架>
此处使用的itcast来指向声明的名称,以便对后面的 名称空间的 引用!
注意:
名称空间的名字语法容易让人混淆,尽管以http://开始,那个 URL 并不指向一个包含的模式定义的文件。
事实上,这个URL:http://www.itcast.cn 根本没有指向任何文件,只是一个分配的名字而已!
16.使用名称空间引入Schema
01.为了声明XML文档遵循Schema文件的具体位置,通常在XML文档中的根节点中用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">
02.schemalLocation 此属性有两个值。
第一个是命名空间
第二个是供命名空间使用的XML Schema的位置,
两者之间使用空格分隔!
03. 注意: 在使用schemaLocation属性时,也需要指定该属性来自哪里!
17.使用默认名称空间:
基本格式:
xmlns="URI"
举例:
<书架 xmlns="http://www.it315.org/xmlbook/schema"
xmls:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn book.xsd">
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
<书架>
18.使用名称空间引入多个XML Schema文档
文件清单:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns="http://www.it315.org/xmlbook/schema"
xmlns:demo="http://www.it315.org/demo/schema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.it315.org/xmlbook/schema http://www.it315.org/xmlbook.xsd
http://www.it315.org/demo/schemahttp://www.it315.org/demo.xsd">
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价 demo:币种=”人民币”>28.00元</售价>
</书>
</书架>
19.不使用名称空间引入XML Schema文档 (这不是使用了名称空间吗??)
文件清单:xmlbook.xml
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="xmlbook.xsd">
<书>
<书名>JavaScript网页开发</书名>
<作者>张孝祥</作者>
<售价>28.00元</售价>
</书>
</书架>
20.在XML Schema 文档中声明名称空间
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www. itcast.cn"
elementFormDefault="qualified">
<xs:schema>
targetNamespace 元素用于指定Schema文档中声明的元素是属于那个名称空间的!
elementFormDefault元素用于指定,Schema中声明的根元素以及其所有子元素都属于 targetNamespace所指定的名称空间!
四、Schema语法:参见 W3C 文档!
记不清这个是老师写的,还是我自己整理的!当时就是老师在那里讲,我在电脑上敲我的笔记和心得! 代码要是打起来麻烦的话,我就直接拷下来了!