XML格式和解析
xml简介
-
概念:可扩展标记语言(EXtensible Markup Language),标准通用标记语言的子集,简称XML
-
特点:
-
是一种很像HTML的标记语言。
-
设计宗旨是传输数据,而不是显示数据。
-
XML标签没有被预定义,根据自己的需要自行定义标签。
-
-
用途:
-
用来传输和存储数据
-
用来作为配置文件
-
-
xml的简单文档结构
<?xml version="1.0" encoding="UTF-8"?> <books> <book id="1" name="book1"> <name>围城</name> <author>钱钟书</author> <price>66</price> </book> <book id="2" name="book2"> <name>老人与海</name> <author>海明威</author> <price>88</price> </book> </books>
- <?xml version="1.0" encoding="UTF-8"?>:是xml文档的说明,标识了版本和编码格式,必须放在文档的第一行
-
< books >,< book >, < name >,< author >,< price >:自定义的标签,根据自己需要去创建使用
-
id, name:自定义的标签属性,根据需要添加即可,属性的值必须使用双引号引起
xml语法规则
-
xML 标签对大小写敏感
-
xML 文档必须有根元素
-
xML 属性值必须加引号
-
xml 预定义的实体引用(由于xml文档使用了一些符号作为文档识别,故使用这些符号时需要使用其预定义的实体引用)
< -----> 代表<符号 > -----> 代表>符号 & -----> 代表&符号 ' -----> 代表'符号 " -----> 代表"符号
-
xml的注释:与html的注释语法一致
<!-- 注释内容 -->
xml元素
-
概念:指的是从(且包括)开始标签直到(且包括)结束标签的部分。
-
元素内容的可能组成(参照html):
- 其他元素
- 文本
- 属性
-
xml 元素的命名规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
注:尽量不要使用 : 冒号可以用于作为命名空间的引用,故尽量不用
xml属性
-
简介:类似html的属性一样
-
定义:使用DTD的方式进行xml标签元素的属性进行定义(下面介绍)
-
使用:与html的使用一样
DTD简介
-
概念:全称为Document Type Definition,中文翻译为文档类型定义,是一套为了进行程序间的数据交换而建立的关于标记符的语法规则。简而言之,就是定义xml语法的限定规则,符合的定义的标签才会发挥作用
-
声明方式:
-
内部声明:
-
声明位置:xml文档声明的下面
-
声明格式:
<!DOCTYPE root-element [element-declarations]>
-
root-element:根标签元素名
-
element-declarations:标签元素的声明描述,其格式如下
- <!ELEMENT element (element-content)>
-
-
使用实例:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books [ <!ELEMENT books (book*)> <!ELEMENT book (name,author,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> ]> <books> <book> <name>围城</name> <author>钱钟书</author> <price>66</price> </book> <book> <name>老人与海</name> <author>海明威</author> <price>88</price> </book> </books>
- <!ELEMENT books (book*)>:对根标签的声明,(book *)表示根标签可以包含book标签任意次
- <!ELEMENT book (name,author,price)>:对book标签的声明,(name,author,price)表示必须该标签必须按顺序包含name,author,price标签
- <!ELEMENT name (#PCDATA)>:对name标签的声明,(#PCDATA)表示标签内的文本为可展开、解析的文本(可展开、解析表示能识别内部的嵌套标签,实体(后面介绍))
- <!ELEMENT author (#PCDATA)>:对author标签的声明
- <!ELEMENT price (#PCDATA)>:对price标签的声明
-
-
外部声明
-
声明位置:外部创建的.dtd文件
-
声明格式:直接使用以下的格式声明每个标签元素即可(后面详细介绍)
<!ELEMENT element (element-content)>
-
element:标签名
-
element-content:标签内容的组成
-
-
引用声明文档的方式:在xml的文档声明下使用以下格式引入即可
<!DOCTYPE root-element SYSTEM "filename">
-
root-element:根标签元素名
-
filename:dtd文件所在的文件路径
-
-
使用实例:
note.dtd文件
<!ELEMENT books (book*)> <!ELEMENT book (name,author,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)>
note.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "note.dtd"> <books> <book> <name>围城</name> <author>钱钟书</author> <price>66</price> </book> <book> <name>老人与海</name> <author>海明威</author> <price>88</price> </book> </books>
注:两个文件在同一个目录下
-
-
-
元素声明:
-
语法:
<!ELEMENT element-name category>或<!ELEMENT element-name (element-content)>
- element-name:元素标签名
- category:元素的种类
- element-content:元素的内容
-
声明一个空标签
<!ELEMENT element-name EMPTY>
-
实例:
<!ELEMENT br EMPTY>
-
-
声明一个可以包含任何内容的标签:
<!ELEMENT element-name ANY>
-
实例:
<!ELEMENT div ANY>
-
-
声明一个带有子元素(顺序严格)的标签:
<!ELEMENT element-name (child1,child2,...)>
-
child1,child2,…:指子标签的名字
-
几个限定符:
- *:出现任意次,在子元素的后面使用
- +:至少出现一次,在子元素的后面使用
- ?:出现0次或一次,在子元素的后面使用
- |:两个子元素中任意一个出现,在两个子元素中使用
-
实例:
<!ELEMENT book (name,author,price?)> <!ELEMENT books (book*)> <!ELEMENT fruit (name,price,address+)>
-
-
声明PCDATA的元素(可展开、解析元素)
<!ELEMENT element-name (#PCDATA)>
-
实例:
<!ELEMENT name (#PCDATA)>
-
-
-
属性声明:
-
语法:
<!ATTLIST element-name attribute-name attribute-type attribute-value>
-
element-name:属性作用的标签元素
-
attribute-name:属性名
-
attribute-type:属性类型
- 常用的属性类型:
- CDATA 值为字符数据 (character data)
- ID 值为唯一的 id
- IDREF 值为另外一个元素的 id
- ENTITY 值是一个实体
- 常用的属性类型:
-
attribute-value:属性值
- 常用的取值:
- 值:属性的默认值
- #REQUIRED:属性值是必需的
- #IMPLIED:属性不是必需的
- #FIXED value:属性值是固定的value
- 常用的取值:
-
-
实例:
<!ATTLIST book id ID "#REQUIRED"> <!-- 为book元素定义一个id属性,类型为唯一的ID,必须给值 --> <!ATTLIST book class CDATA "book"> <!-- 为book元素定义一个class属性,类型为字符数据,默认值为book -->
-
-
实体:
-
简介:实体即对xml中的关键字进行定义,避免与xml中的被占用的符号冲突。比如<>,被作为标签的界限,在文本中想使用就需要使用其实体进行引用
-
定义语法:
<!ENTITY entity-name "entity-value">
- entity-name:实体名
- entity-value:实体的值
-
使用语法:
&entity-name;
-
实例:
<!ENTITY lt "<"> <!-- 使用lt替代< -->
-
xml文档的解析:
-
dom4j中主要的两个类及常用的方法:
-
Element类:
- 简介:对应xml中的一个标签元素
- 常用方法:
- List elements():获取标签元素中的子元素
- Iterator elementIterator():获取标签元素中的子元素迭代器
- List attributes():获取标签元素中的属性
- Iterator attributeIterator():获取标签元素中的属性迭代器
- String getName():获取标签名
- String getText():获取标签元素中的文本信息
-
Attribute类
- 简介:对应xml中标签元素的属性
- 常用方法:
- String getValue():获取属性值
- String getName():获取属性名
-
-
步骤及其使用的方法:
-
导入dom4j的jar包
-
定义读取xml文件的对象
SAXReader reader = new SAXReader();
-
通过SAXReader对象获取xml文档对象(类似于html的dom树)
Document document = reader.read(filename);
-
通过Document对象获取根标签
Element root = document.getRootElement();
-
通过Element对象获取根标签的子标签元素:
Iterator<Element> it = root.elementIterator();
-
通过Element对象获取标签的属性及属性值:
Iterator<Attribute> it = root.attributeIterator();
-
通过Element对象获取标签的内容:
String text = element.getText();
注:6、7可根据需要组合
-
-
xml文件的解析例子:
-
note.dtd文件
<!ELEMENT books (book*)> <!ELEMENT book (name,author,price)> <!ELEMENT name (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT price (#PCDATA)> <!ATTLIST book id ID "#REQUIRED"> <!ATTLIST book class CDATA "book">
-
note.xml文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE books SYSTEM "note.dtd"> <books> <book id="a"> <name>围城</name> <author>钱钟书</author> <price>66</price> </book > <book id="b"> <name>老人与海</name> <author>海明威</author> <price>88</price> </book> </books>
-
XMLParse.java文件
package cn.zero; import java.util.Iterator; import java.util.List; import org.dom4j.Attribute; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class XMLParse { public static void main(String[] args) throws Exception { //定义SAXReader对象,用于读取xml文件 SAXReader reader = new SAXReader(); //获取xml文件,并得到xml的文档对象 Document document = reader.read("src/note1.xml"); //获取根标签元素 Element root = document.getRootElement(); //获取根标签元素的子标签迭代器,并遍历 for (Iterator<Element> it = root.elementIterator(); it.hasNext();) { Element element = it.next(); //遍历,得到一个元素 //获取子标签的属性迭代器 Iterator<Attribute> attribute = element.attributeIterator(); //遍历子标签的属性 while(attribute.hasNext()) { Attribute atb = attribute.next(); //输出子标签的属性和属性值 System.out.println(atb.getName() + " : " + atb.getValue()); } //获取子标签的子标签 List<Element> elements = element.elements(); //遍历子标签的子标签 for(int i = 0; i < elements.size(); i++) { //输出子标签的子标签的标签名和标签内的文本 System.out.println(elements.get(i).getName()+" : "+ elements.get(i).getText()); } } for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext();) { Attribute attribute = it.next(); // do something } } }
-
2020/4/1 18:46:53 水平有限,有不对的地方望指教