1、XML的语法
- 文档声明
写法: <?xml version="1.0" ?>-
文档声明必须出现在xml文件的第一行和第一列的位置。
-
属性:
- version="1.0" XML的版本 (必须写)
- encoding="UTF-8" 编码集 (可选的)
- standalone="yes或者no" 代表xml的文件是否是独立的。(如果是no,不独立,可以引入外部的文件)(可选的)
- 因为不写该属性,可以引入外部的文件。
-
乱码会伴随你们一生?
- 产生的原因:保存文件时和打开文件时采用的编码不一致。
- 解决办法:保存文件可打开文件采用的编码一致就ok。(MyEclipse不会产生乱码问题)
-
-
元素(***)
- 要有开始有结束。
- 不能交叉嵌套
- 只能有一个根元素(必须有,并且只能有一个)
- 命名规范:
- 区分大小写 错误的:<a></A> 代表两个标签
- 不能以数字和-中划线开头 错误的:<1a> <-a>
- 不能以XML(Xml XML xml)开头 错误的:<xmlaa>
- 不能包含空格和冒号。
-
属性(***)
- 自定义:命名规范同上。
- 在同一个元素上,不能有相同的属性。(*****)
- 可以使用双引号或者单引号。
-
注释(*)
- 和HTML的注释相同
- 注释不能嵌套。
- 特殊字符
* < <
* > >
* & &
* " "
* ' '- CDATA区
- 把标签中的内容作为字符串。
- 语法:<![CDATA[
内容:当成字符串
]]>
- CDATA区
-
PI(处理指令)--如文档声明等等
*可结合css对显示的内容进行控制。
2、DTD约束
约束出现的目的是为了xml的可读与规范,如规定可以拥有哪些属性、元素等。
-
DTD的约束
* 快速入门
* 快速入门的步骤:
* 需要出现哪些标签?
* 在DTD的文件中编写元素
<!ELEMENT 元素名称 元素类型>
* 判断元素是否是复杂还是简单元素?
* 如果是简单元素:(#PCDATA) 代表是字符串
* 如果是复杂元素:(子节点)* 需要在book.xml引入DTD的文件 * <!DOCTYPE 根节点 SYSTEM "DTD文件的地址"> * DTD与XML文档的关联方式 * 可以在XML的文件中直接书写DTD的代码。(经常使用) <!DOCTYPE 根节点 [ DTD的代码 ]> * 引入本地的DTD文件(经常使用) <!DOCTYPE 根节点 SYSTEM "DTD文件的地址"> * 引入网络上的DTD文件 <!DOCTYPE 根节点 PUBLIC "DTD文件名称" "DTD文件的地址">
-
元素定义
* 语法:<!ELEMENT 元素名称 元素类型>
元素类型:
* (#PCDATA) 字符串
* EMPTY 空
* ANY 任意的
* (子元素)* 子元素: * 子元素之间的关系 * , 子元素出现是有顺序的 * | 子元素只能出现一个 * 子元素出现的次数 * + 子元素出现1次或多次 * * 子元素出现0次或多次 * ? 子元素出现0次或1次 <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)> <MYFILE> <TITLE></TITLE> <AUTHOR></AUTHOR> <EMAIL></EMAIL> <TITLE></TITLE> <AUTHOR></AUTHOR> <EMAIL></EMAIL> <TITLE></TITLE> <AUTHOR></AUTHOR> <EMAIL></EMAIL> </MYFILE>
-
属性定义(AttributeList)
* 写法: <!ATTLIST 元素名称
属性名称 属性类型 属性约束
属性名称 属性类型 属性约束
>
* 属性类型
* CDATA 字符串
* 枚举(没有提供关键字) (男人|女人)
* ID 代表唯一的值,不能只写数字* 属性的约束 * #REQUIRED 必须出现的。必选属性的值可以等于空,只要出现在元素中就可以,如:name属性必选,则name=“”也是可以的,可以不写值。 * #IMPLIED 可选的 * #FIXED 固定值 #FIXED "值" * 默认值(不用)
-
实体定义(用的不多)
* <!ENTITY 别名 "值" >
* 需要在xml中引入别名--&别名;,浏览器打开文件后,在引入的位置上显示值的。
3、schema约束
-
schema约束:
* schema和DTD的对比(面试题):
* schema符合XML的语法结构。
* 可以解析schema文档。
* schema对名称空间支持的好。
* schem支持更多的数据类型,自定义的数据类型。* 在schema中预先给xml定义元素和属性 * schema的后缀名是.xsd * 只能有一个根节点,名称是schema。
- schema命名空间详解:
xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
// 引入W3C名称空间,我是实例文档。
xmlns="http://www.itcast.cn/book.xsd"
//引入自己编写的schema的文档
xsi:schemaLocation="http://www.itcast.cn/book.xsd book.xsd">
//引入自己写的schema文档地址--“命名空间,位置”
//问题:元素上不能有相同的属性名称,不可有两个xmlns属性
* 解决:起别名
* 技巧:在下面出现标签的概率小起别名
<书>
<书名>三国演义</书名>
<出版社>中信出版社</出版社>
<售价>89.7</售价>
<作者>罗贯中</作者>
</书>
</书架>
xsd文件:
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
// xsd文档属于xml,element等元素都是w3c提供的基本元素,我们需要引用,所以它的命名空间一定要写。
targetNamespace="http://www.itcast.cn/book.xsd"
//【自己写的xsd】要起一个名字,可以任意起,为防止重名推荐在前面加上公司域名。
elementFormDefault="qualified">
//qualified-质量好的,unqualified-非质量好的。(比如,若为unqualified,则别名仅可写在最外层,内层有用到别名的元素可不写,
但容易出现问题,本例中若自己写的xsd的命名空间起别名aa,有多个
书元素,且各个书元素用到的命名空间不一样,就容易造成混乱,搞不清哪个书用的是哪个命名空间的。)
<element name="书架">
<complexType>
<sequence>
<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>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema> - 定义属性:置于sequence和complexType之间。
</sequence>
<attribute name="出版社" type="string" use="required"></attribute>
</complexType> -
simpleContent:仅含文本的。
- xsd中any:引入任何标签。
4、XML解析
![](https://img.haomeiwen.com/i3601125/794420a34d54b362.png)
-
常用的有两种?DOM和SAX
* 区别:
DOM解析XML
* 在内存中形成树状结构
* 缺点:如果文档过大,容易产生内存溢出的问题。
* 优点:方便做增删改的操作SAX解析 * 基于事件驱动,边读边解析 * 优点:不会产生内存溢出问题。 * 缺点:不能做增删改操作。(DOM4J在内存生成树状结构) *,只能使用DOM方式,如果SAX,只能做查询。 * DOM4J(*****) JAXP SUN提供的 * 想做增删改 企业都在用。DOM4J提供的 * 全部都可以做。 * JDOM(不讲了)
![](https://img.haomeiwen.com/i3601125/e29b7115af096e73.png)
4.1、JAXP解析HTML---jaxp开发包是Javase的比部分。具体方法、获取节点等去看jdk开发文档。
* DOM
* DocumentBuilderFactory :解析器工厂类
* DocumentBuilder 获取解析器对象
* 解析XML(Document parse(String uri) )
// 获取解析器工厂类
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 获取解析器对象
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析XML的文档,返回document对象
Document document = builder.parse("src/book2.xml");
* 回写
* 获取回写的工厂类
* 获取回写对象
* 调用回写的方法进行回写。
// 创建回写类的工厂
TransformerFactory transformerFactory = TransformerFactory.newInstance();
// 获取回写类
Transformer transformer = transformerFactory.newTransformer();
// 调用回写的方法
transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));
//Source(document)为输入源。
注意,在DOM中:父接口Node的子接口有Document、Element等,故Node有的方法,Document和Element等子接口都有,而子接口有的方法Node不一定有。
![](https://img.haomeiwen.com/i3601125/b5b6a9e7764a41a9.png)
![](https://img.haomeiwen.com/i3601125/81801b3110cc999c.png)
注意:- <a price="9">haha</a>Element节点中最多只可能有Attr节点,文本节点与Element节点是相互独立的。
- 注意划红线部分,hasAttribute方法仅Element可成功调用。
4.2、 JAXP的SAX解析
- 只能做查询,不能做增删改。
* SAX解析
* 解析器
* 获取解析器的工厂
* 获取解析器对象
* 解析XML(XML的文件的地址,事件处理器)
![](https://img.haomeiwen.com/i3601125/31412a3cc8822132.png)
* 事件处理器
* 自己编写的类,需要继承DefalutHandler类,重写三个方法。(自己决定是打印还是保存)
* startElement()
* characters()
* endElement()
* SAX的解析原理:
解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分, (边读边解析)
都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,
会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
事件处理器由程序员编写,程序员通过事件处理器中方法的参数,
就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
4.2、 DOM4J的解析(必须会,企业中用的多)
* 先下载DOM4J相应的jar包。导入工程中,才能使用。
* 把dom4j-1.6.1.jar导入到工程中。
* WEB项目:复制dom4j-1.6.1.jar到 WebRoot -- WEB-INF -- lib里面。就ok。
* DOM4J对XPATH的支持
* 导入包。jaxen-1.1-beta-6.jar。
* 怎么使用?
selectNodes("/AAA") 返回集合
selectSingleNode() 一个Node对象
* 参数就是xpath的语法
* /AAA/BBB 获取BBB的节点
* //BBB 无论层级关系,找到BBB的节点
* * 代表是所有
* /AAA/BBB[1] 找到BBB的第一个 /AAA/BBB[last()] 最后一个
* @ 属性
- DOM4J扩展:
通过XML管理学生的信息。
可以在项目下建立一个xml用于存放学生信息,建一个学生类,操作类(用于对xml操作增删改查),测试类。
网友评论