一、XML
1.1 xml的概述
1.1.1 什么是xml
- xml指可扩展标记语言
- XML是一种标记语言,类似THML
- XML的设计宗旨是传递数据 ,而非显示数据
- XML的标签没有事先定义,需要自行定义
- XML被设计为具有自我描述性(就是易于阅读)
- XML是W3C的推荐标准。
注意: 现在我们学习的还是1.0版本,04年发布的1.1版本向下不兼容,被舍弃。
1.1.2 XML与HTML的主要差异
- xml不是html的 替代
- xml和html为不同的目的而设计
- xml被设计为传输和存储数据,其焦点是数据的内容
- html被设计用来显示数据, 其焦点是数据的外观
- html显示信息,xml传输信息。
1.2 XML的组成
文档声明,元素element,属性,注释,转义字符,字符区
<!--
xml组成:
文档声明:
声明该文件是一个xml文件,声明版本和编码方式
元素:标签
标签名称自定义。
双标签(围堵标签):有开始和结束标签
eg: <xxxx></xxxx>
单标签(空标签):eg:<xxx/>
属性:
定义在开始标签上
双标签:属性名称自定义
<xxx 属性名称="值" 属性名称="值"></xxx>
单标签(空标签):eg:<xxx 属性名称="值" 属性名称="值"/>
注释:
对代码的说明
转义字符:像大于号,小于号,需要用转义字符
字符区:
字符区中的信息不会被转义
-->
代码
<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person id="001">
<姓名>Saber</姓名>
<sex>女</sex>
<discription>数学 < 语文</discription>
</person>
<person id="002">
<姓名>Aecher</姓名>
<sex>男</sex>
<discription>
我知道html的语法格式
<!--字符区-->
<![CDATA[
<<html>
<<head>
<title> </title>
</head>>
<body>
<h1>吃香蕉!</h1>
</body>
</html>
]]]>
</discription>
</person>
</persons>
1.3 XML文件的约束
在XML技术中,可以编写一个文档来约束XML文档的书写规范, 称为XML约束。
常见的XML约束:DTD,Schema
1.3.1 DTD约束
语法
<!ELEMENT 标签名字 标签类型>
标签类型
标签类型 | 代码写法 | 说明 |
---|---|---|
PCDATA | (#PCDATA) | 被解释的字符串数据 |
EMPTY | EMPTY | 即空元素,例如< hr/> |
ANY | ANY | 即任意类型 |
代码
<!ELEMENT 书架 (书+)> <!-- 约束根标签的名称为 "书架" 及子标签出现的次数-->
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)> <!-- PCDATA: 约束标签体信息为字符串 -->
<!ELEMENT 作者 EMPTY> <!-- EMPTY: 约束当前标签为单标签-->
<!ELEMENT 售价 ANY> <!-- ANY: 标签类型任意 -->
引入DTD约束的方式
- 内部约束
- 外部约束
- 公共约束(互联网约束)
<!--内部约束
<!DOCTYPE 跟标签名称 [dtd约束...]>
-->
<!--
<!DOCTYPE 书架 [<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)><!–约束元素书的子元素必须为书名、作者、售价–>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
-->
<!--
外部约束:
<!DOCTYPE 跟标签名称 SYSTEM "文件名称.dtd">
-->
<!--
公共约束(互联网约束)
<!DOCTYPE web-app PUBLIC
"http://java.sun.com/dtd/web‐app_2_3.dtd">
-->
数量词(掌握)
数量词符号 | 含义 |
---|---|
* | 表示元素可以出现0到多个 |
+ | 表示元素可以出现至少一个 |
? | 表示元素可以是0个或1个 |
,(逗号) | 表示元素需要按照顺序显示 |
竖杠(这个打不出来) | 表示元素需要选择其中的某一个 |
1.4 Schema约束
概述:
1.Schema比DTD 强大,是DTD代替者
2. Schema本身也是XML文档,单Schema的文档扩展名为XSD
3. Schema功能更强大,数据类型约束更完善
4. Schema可以进一步约束标签体数据的类型
约束文件后缀名: -.xsd
代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
一个xml文件可以被多个schema文件约束
为了区分不同的约束文件,我们可以 给约束文件起别名
引入schema约束文件方式、:
xmlns:xml namespace
-->
<书架
xmlns="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
>
<书>
<书名>西游记</书名>
<作者>吴承恩</作者>
<售价>66</售价>
</书>
</书架>
二 、解析XML
2.1 解析方式和解析器
- 开发中比较常见的解析方式
- DOM:要求把整个XML文档装载到内存,并解析成一个Document对象。
优点: 元素与元素之间保留结构关系,可以进行增删改查
缺点: xml文档过大,容易造成内存溢出。 - SAX:速度更快 ,更有效的方法。一边扫描一边解析。
优点: 处理速度快,可以处理大文件。
缺点: 只能读,读完释放资源,不能进行增删改查、- PULL:Android内置的解析方式,类似SAX.
- DOM:要求把整个XML文档装载到内存,并解析成一个Document对象。
2.2 DOM4J
public static void main(String[] args) throws DocumentException {
//1.导入jar包
//2.创建核心解析对象
SAXReader reader = new SAXReader();
//3.读取文件获取dom对象
InputStream is = DocumentDemo.class.getClassLoader().getResourceAsStream("books.xml");
Document document = reader.read(is);
//4.从dom对象中获取 元素 属性 标签体信息
Element rootElement = document.getRootElement();
System.out.println(rootElement);
System.out.println("-------获取元素的所有子元素-------");
// 格式:List elements([String ele] )
// 获得指定名称的所有子元素。可以不指定名称
List <Element>list = rootElement.elements("book1");
for (Element element : list) {
System.out.println(element);
}
System.out.println("-------获取元素的一个子元素-------");
// Element element(String ele)
// 获得指定名称第一个子元素。
Element ele = rootElement.element("book");
System.out.println(ele);
System.out.println("-------获取元素的名称-------");
// String getName()
// 获得当前元素的元素名
String name = rootElement.getName();
System.out.println(name);
System.out.println("-------获取元素上属性的值-------");
// String attributeValue(String attrName)
// 获得指定属性名的属性值
String aa = rootElement.attributeValue("aa");
System.out.println(aa);
System.out.println("-------获取元素子元素标签体的信息-------");
// String elementText(Sting ele)
// 获得指定名称子元素的文本值
List<Element> list1 = rootElement.elements();
for (Element element : list1) {
System.out.println(element.elementText("name"));
}
System.out.println("--------获取当前元素标签体的信息---------");
List <Element>list2 = rootElement.elements();
for (Element element : list2) {
List <Element>list3 = element.elements();
for (Element element1 : list3) {
System.out.println(element1.getText());
}
}
}