1.XML
用word,txt传输数据,和xml一样都没有格式约束,但xml格式规范。
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 如上行文档声明 : 版本 和 编码 -->
<!--
xml基本语法:
1. 标签分类 :
1. 成对标签 : start tag - 内容 - end tag
开标签 闭标签
<标签名> </标签名>
2. 单独标签 : 自关闭标签 <标签名/>
2. xml有且仅有一个根标签 root tag (第一个标签,xml中的所有内容都在内)
3. 标签可以拥有属性的(开标签和自关闭标签) key=value 即 id="003"
了解:
实体字符(转义字符):
< -> < less than即缩写lt
> -> > greater than
< > 小于或大于就是不等于,前端支持,java不支持
CDATA: unparsed character data 不解析的字符数据
在这里的内容是不会被解析器所解析(看成注释)
-->
<list>
<![CDATA[" if(x < > 1){ sout: xx} "]]>
<hehe id="003"/>
<book id="001">
<name>java基础入门</name>
<desc>人生必读第一本书</desc>
<price>998</price>
<extra>if(x < > 1){ sout: xx}</extra>
</book>
<book id="002">
<name>java从入门到放弃</name>
<desc>人生的最后一本</desc>
<price>11</price>
</book>
</list>
<?xml version="1.0" encoding="UTF-8" ?>
<!--
可扩展: 开发者随意命名标签
存数据 为了 以后 取数据(解析 parse)
问题:会给数据解析带来麻烦
解决: 约束(规则,规范)给xml指定约束, 其内部拥有什么内容,以及内容的编写格式都有要求
规则: list里面必须是book标签(多个)
book标签里还可以有name desc price等标签
这些标签,里面有文本内容
两种约束: DTD: document type definition 文档类型定义 (了解)
Schema : 模式 (了解) 替代DTD,全称(XML Schema Definition,XSD)
-->
2.DTD约束
<?xml version="1.0" encoding="UTF-8" ?>
<!--
约束: 1. 根标签 必须是list
2. list里有book (+ : 表示1个或多个book标签)
3. book里有name desc price
4. name desc price = PCDATA(parsed character data) 可以包含文本
5. book 有一个属性 id 默认值 为 999
如下写完约束后,会自动提示
-->
<!DOCTYPE list [
<!ELEMENT list (book+)>
<!ELEMENT book (name,desc,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT desc (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book id CDATA "999">
]>
<!--111111111111111111111111111111111111111111111111111111111111111-->
<list>
<book id="001">
<name>java基础入门</name>
<desc>人生必读第一本书</desc>
<price>998</price>
</book>
<book id="002">
<name>java基础入门</name>
<desc>人生必读第一本书</desc>
<price>998</price>
</book>
</list>
3.schema约束
如下文件05_book.xsd
<?xml version='1.0' encoding='UTF-8' ?>
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='http://www.itheima.com'
elementFormDefault="unqualified">
<!--
上面几行就是命名空间技术,需要被另一个文件引用即06_book.xml引用才可以生效。schema 约束: 约束规则用xml语法来书写的。
element : 元素(开标签到闭标签之间的内容,我们统称为标签)
complexType : 复杂类型(但凡元素有子标签或属性)
sequence : 序列 (子元素的序列)
maxOccurs: 最大出现次数,如下书标签最少出现一次,至多随意
-->
<!--11111111111111111111111111111111111111111111111111111111111111111111111111111-->
<xs:element name='书架' >
<xs:complexType>
<xs:sequence maxOccurs='unbounded' minOccurs="1">
<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>
如下是06_book.xml调用05_book.xsd
<?xml version="1.0" encoding="UTF-8"?>
<itheima:书架 xmlns:itheima="http://www.itheima.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.itheima.com 05_book.xsd">
<!--11111111111111111111111111111111111111111111111111111111111111111111111-->
<书>
<书名>呵呵</书名>
<作者>啦啦</作者>
<售价>嘻嘻</售价>
</书>
</itheima:书架>
如下xml用到在线的xsd,自动补全。
4.xml解析(了解)
dom4J不是sun公司开发的,所以放入lib目录,add as Library相当于解压,sun公司开发的放External libraries。SAX解析读完一行解析完就可以当时释放解析内容,不耗内存但慢。SAX的变形pull。
package com.itheima04.parse;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.util.List;
public class ParseDemo {
public static void main(String[] args) throws DocumentException {
SAXReader reader = new SAXReader();
//将下面这个文件读到内存中
Document document = reader.read("02_book.xml"); //document文档对象 表示 02_book.xml文件的
Element rootElement = document.getRootElement(); //解析过程: 爬树
List<Element> books = rootElement.elements("book"); //获取根元素 store的所有book子元素
for (Element book : books) {
String name = book.elementText("name"); //获取子标签内部的文本数据
String desc = book.elementText("desc");
String price = book.elementText("price");
String id = book.attributeValue("id"); //获取book标签的属性id的值
System.out.println(id + "," + name + "," + desc + "," + price);
}
}
}
5.javase总结
B站/知乎/微信公众号:码农编程录