标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)
可扩展:标签的名字是可以自定义的
用于进行存储数据和传输数据
作为软件的配置文件
标签由一对尖括号和合法标识符组成 < user >
标签必须成对出现< user >< user/>
特殊的标签可以不成对,但是必须有结束标记< user/ >
标签中可以定义属性,属性和标签名空格隔开属性值必须用引号(单/双)引起来< user id = "100"/>
标签需要正确的嵌套
后缀名为.xml
文档声明必须是第一行第一列
<?xmlversion="1.0”encoding="UTF-8" standalone= “yes”?> 其中 version属性必须存在 encoding属性不是必须的,作用:打开当前xml文件的时候应该是使用什么字符编码表(默认都是UTF-8) standalone属性不是必须的,作用:描述XML文件是否依赖其他的xml文件,取值为yes/no
必须存在根标签
XML文件中可以定义注释信息
XML文件中可以存在以下特殊字符
<-----------------小于 >-----------------大于 &----------------和号(&) '---------------单引号 "---------------引号
XML可以存在CDATA区
<![CDATA[ ...内容...]]>
DOM(DocumentObject Model)文档对象模型:
就是把文档的各个组成部分看做成对应的对象,会把xmI文件全部加载到内存在内存中形成一个树形结构,再获取对应的值
其中DOM对象主要有以下部分
Document对象:整个xml文档
Element对象:所有标签
Attribute对象:所有属性
Text对象:所有文本内容
其中Element,Attribute,Text有一个共同的父类:Node对象
JAXP:SUN公司提供的一套XML的解析的API
JDOM:开源组织提供了一套XML的解析的API-jdom
DOM4J:开源组织提供了一套XML的解析的API-dom4j
pull :主要应用在Android手机端解析XML
首先下载jar包
xml文件
<?xml version="1.0" encoding="utf-8" ?>
<books>
? ?<book id="1">
? ? ? ?<name>语文</name>
? ? ? ?<versions>人教版</versions>
? ?</book>
? ?<book id="2">
? ? ? ?<name>数学</name>
? ? ? ?<versions>人教版</versions>
? ?</book>
? ?<book id="3">
? ? ? ?<name>数学</name>
? ? ? ?<versions>苏教版</versions>
? ?</book>
? ?
? ?<user id="1">
? ? ? ?<name>小明</name>
? ? ? ?<studentID>1235354</studentID>
? ?</user>
</books>
需求:
解析这个xmI文件
将解析到的Book标签数据封装到Book对象中并将其存储到ArrayList集合中
遍历集合
解析类:
public class Analysis {
?
? ?public Document parseUrl(String url) throws DocumentException {
? ? ? ?SAXReader reader = new SAXReader();
? ? ? ?return reader.read(url);
? }
? ?public Document parseUrl(File file) throws DocumentException {
? ? ? ?SAXReader reader = new SAXReader();
? ? ? ?return reader.read(file);
? }
?
}
Book类
public class Book {
? ?private String name;
? ?private String version;
? ?private Long id;
?
? ?public Book() {
? }
?
? ?public Book(String name, String version, Long id) {
? ? ? ?this.name = name;
? ? ? ?this.version = version;
? ? ? ?this.id = id;
? }
?
? ?public String getName() {
? ? ? ?return name;
? }
?
? ?public void setName(String name) {
? ? ? ?this.name = name;
? }
?
? ?public String getVersion() {
? ? ? ?return version;
? }
?
? ?public void setVersion(String version) {
? ? ? ?this.version = version;
? }
?
? ?public Long getId() {
? ? ? ?return id;
? }
?
? ?public void setId(Long id) {
? ? ? ?this.id = id;
? }
?
? ?@Override
? ?public String toString() {
? ? ? ?return "Book{" +
? ? ? ? ? ? ? ?"name='" + name + '\'' +
? ? ? ? ? ? ? ?", version='" + version + '\'' +
? ? ? ? ? ? ? ?", id=" + id +
? ? ? ? ? ? ? ?'}';
? }
}
测试类
public class Application {
? ?public static void main(String[] args) throws ?DocumentException {
?
? ? ? ?File file = new File("reflection\\src\\xml\\bookstores.xml");
? ? ? ?Analysis analysis = new Analysis();
? ? ? ?Document document = analysis.parseUrl(file);
?
? ? ? ?//获取根标签
? ? ? ?Element rootElement = document.getRootElement();
? ? ? ?//通过根标签获取book标签
? ? ? ?//无参elements()获取所有子标签
? ? ? ?List<Element> elements = rootElement.elements();
? ? ? ?System.out.println(elements.size());
? ? ? ?elements.forEach(book -> {
? ? ? ? ? ?System.out.println(book.getName());
? ? ? });
?
? ? ? ?//有参elements(标签名)可以获取所有的指定子标签
? ? ? ?List<Element> books = rootElement.elements("book");
? ? ? ?System.out.println(books.size());
?
? ? ? ?books.forEach(book -> {
? ? ? ? ? ?System.out.println("=====================================");
? ? ? ? ? ?//获取属性对应的属性值
? ? ? ? ? ?System.out.println(book.attribute("id").getValue());
? ? ? ? ? ?//获取该标签下的子标签
? ? ? ? ? ?book.elements("name").forEach(name -> {
? ? ? ? ? ? ? ?//获取标签体的内容
? ? ? ? ? ? ? ?System.out.println(name.getText());
? ? ? ? ? });
?
? ? ? ? ? ?book.elements("version").forEach(v -> {
? ? ? ? ? ? ? ?//获取标签体的内容
? ? ? ? ? ? ? ?System.out.println(v.getText());
? ? ? ? ? });
? ? ? });
? ? ? ?System.out.println("------------------------------------");
?
? ? ? ?//准备封装
? ? ? ?ArrayList<Book> bookArrayList = new ArrayList<>();
? ? ? ?books.forEach(book -> {
? ? ? ? ? ?Book book1 = new Book(book.element("name").getText(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?book.element("version").getText(),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Long.valueOf(book.attribute("id").getValue()));
? ? ? ? ? ?System.out.println(book1);
? ? ? ? ? ?bookArrayList.add(book1);
? ? ? });
? ? ? ?//最后检查"
? ? ? ?System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
? ? ? ?bookArrayList.forEach(book -> System.out.println(book.toString()));
?
?
?
? }
}
用来限定xml文件中可使用的标签以及属性
DTD
schema
创建一个文件,后缀名为.dtd
看xml文件中使用了哪些元素(<!ELEMENT>可以定义元素)
判断元素是简单元素还是复杂元素
简单元素:没有子元素
复杂元素:有子元素的
根据上面的xml写一个DTD约束文件
<!ELEMENT books (book,user)>
<!ELEMENT book (name,version)>
<!ELEMENT user (name,studentID)>
?
<!ELEMENT studentID (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT version (#PCDATA)>
需要掌握:
能在xml文件中引入dtd约束文档
能够简单阅读约束文档
能根据约束文档写xml文件
方式一:引入本地dtd
<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 SYSTEM(表示引入本地DTD) ‘DTD文件路径’>-->
<!DOCTYPE books SYSTEM 'restrain.dtd'>
方式二:在xml文件内部引入
<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 [](表示内部引入dtd,[]内写约束内容)>-->
<!DOCTYPE books [] >
方式三:引入网络dtd
<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 PUBLIC(表示引入网络DTD) “dtd文件名” “dtd文档的url”>-->
<!DOCTYPE books PUBLIC “dtd文件名” “dtd文档的url”>
<!ELEMENT元素名 元素类型>
简单元素
EMPTY:表示标签体为空
ANY:表示标签体可以为空也可以不为空
PCDATA:表示该元素的内容部分为字符串
复杂元素
直接写子元素名称。
多个子元素可以使用”,“或者 ”|" 隔开;
” , ":表示定义子元素的顺序
”|”: 表示子元素只能出现任意一个
"?“:零次或一次
” + ":一次或多次
" * ":零次或多次;
如果不写则表示出现一次
<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
属性的类型
CDATA类型:普通的字符串
属性的约束:
#REQUIRED:属性是必须的
#IMPLIED:属性不是必需的
#FIXED value:属性值是固定的value值