XML

——————借用MR.liu的成果——————

xml定义 来自百度百科
可扩展标记语言,标准通用标记语言的子集,一种用于标记电子文件使其具有结构性的标记语言。
它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。


1998年2月,W3C正式批准了可扩展标记语言的标准定义,可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门,客户,和供应商之间进行数据交换,实现动态内容生成,企业集成和应用开发。可扩展标记语言可以使我们能够更准确的搜索,更方便的传送软件组件,更好的描述一些事物。例如电子商务交易等。


一、什么是可扩展标记语言?
可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。
它的标签没有被预定义。您需要自行定义标签。
它被设计为具有自我描述性。
它是W3C的推荐标准。


二、可扩展标记语言和超文本标记语言之间的差异
它不是超文本标记语言的替代。
它是对超文本标记语言的补充。
它和超文本标记语言为不同的目的而设计:
它被设计用来传输和存储数据,其焦点是数据的内容。
超文本标记语言被设计用来显示数据,其焦点是数据的外观。
超文本标记语言旨在显示信息,而它旨在传输信息。
对它最好的描述是:它是独立于软件和硬件的信息传输工具。
3、可扩展标记语言是W3C的推荐标准
XML 于 1998 年 2 月 10 日成为 W3C 的推荐标准。
4、可扩展标记语言无所不在
目前,它在Web中起到的作用不会亚于一直作为Web基石的超文本标记语言。
XML 是各种应用程序之间进行数据传输的最常用的工具。

标记语言,是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据
处理细节的电脑文字编码。当今广泛使用的标记语言是超文本标记语言(HyperText Markup Language,
HTML)和可扩展标记语言 (eXtensible Markup Language,XML)。标记语言广泛应用于网页和网
络应用程序。
1) 超文本标记语言 HTML(Hyper Text Markup Language)
? 写法格式: <a href="link.html">link</a>
? 关注数据的展示不用户体验
? 标记是固定的,丌可扩展(如 <a></a>表示超链接)
2) 可扩展的标记语言 XML(eXtensible Markup Language)
? 写法格式: 同 html 样式 <a>link</a>
? 仅关注数据本身
? 标记可扩展,可自定义
3) Xml 和 Html 语言由同一种父语言 SGML(Standard Generalized Markup Language,标准通
用标记语言)发展出来的两种语言。
4) 解析器
? 与用解析器(比如:XML SPY 与用于解析 XML 文件)
? 浏览器
? MyEclipse
5) W3C(World Wide Web Consortium)
? W3C: 开源的语言协会,万维网联盟(World Wide Web Consortium)
? HTML 和 XML 都是 W3C 制定的语言规则
? 官网:www.w3.org
? 学习网站:http://www.w3school.com.cn/

案例1: (错误演示)


语法规则:
1:
xml 的声明必须写在文件第 1 行
Encoding(字符集)属性可以省略,默认的字符集是 utf-8
常见错误

"?"和 xml 之间不能有空格
不要多写空格(Java 程序员的习惯)


标记
诸如 <书名></书名> 这样格式的被称为标记,标记成对出现
标记包括开始标记和结束标记


元素
元素(Element)
1) 元素: 元素包括标记和其中的内容
2) 根元素: 最外层的元素叫根元素
3) 叶子元素: 最里层的(没有子元素的)元素叫叶子元素
4)空元素:没有内容的元素叫空元素,比如<a></a>,可以简写为:<a />
5)元素必须遵循的语法规则
? 所有的标记都必须有结束
? 开始标记和结束标记必须成对出现
? 元素必须正确嵌套
<a><b>c</b></a> (正确)
<a><b>c</a></b> (错误)
? 标记的大小写敏感 Hello 和 hello 不是同一个标记
? 有且只能有一个根元素


. 实体引用(转义字符)
1) 小于号(<): less than --> &lt ;
2) 大于号(>): great than --> &gt ;
3) And 符号(&): &amp;
4) 双引号(“): &quot;
5) 单引号(‘): &apos;
注意这些转义字符都是以&开头,以;结尾的

属性(定义在开始标记中的键值对)
1) 格式:属性="属性值"
2) 要求:
属性必须有值
属性值必须用引号引起来,单引号或双引号都可以,但必须一致

CDATA 类型的数据:特殊标签

1) 格式: < ! [ CDATA [ 文本内容 ] ] >
2) 特殊标签中的实体引用都被忽略,所有内容被当成一整块文本数据对待

1) 必须有唯一的根元素
2) xml 标记大小写敏感
3) 标记必须配对出现,有开始有结束
4) 元素必须被正确嵌套
5) 属性必须有值,值必须用引号引起来
6) 如果遵循所有的规则,称作格式良好的 xml 文件(well-formed)

早期属性文件描述数据的方式
url = jdbc:mysql://localhost:3306/wode
dbUser = root
dbPwd = admin
2) 现在使用 xml 表示方式
<datasource id="db_mysql">
<property name="url">jdbc:mysql://localhost:3306/wode</property>
<property name="dbUser">root</property>
<property name="dbPwd">admin</property>
</datasource>


DTD/Schema
1) DTD / Schema: 用来规范 XML 的标记规则
2) 有效的 xml 文件(valid xml file) = 格式良好的 xml 文件 + 有 DTD 或 Schema 规则 + 遵循
DTD 或 Schema 的规则


行业交换数据时要求 xml 文件格式相同,所以需要大家遵守规范的 xml 文件格式,比如两仹 xml
文件要有相同的元素嵌套关系、相同的属性定义,相同的元素顺序,元素出现相同的次数等。

文档类型定义 DTD(Document Type Difinition)
1) DTD 文档用来定义 XML 文件的格式,约束 XML 文件中的标记规则
2) DTD 类型
PUBLIC(行业共用的)
SYSTEM(小范围自定义的)
<!DOCTYPE books[
<!ELEMENT books (java*,javascript*,(phone|email)*)>
<!ELEMENT java (name,author,price)>
<!ELEMENT javascript (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
]>
必须列出所有节点,一个都不能少
* 0-n
至少有 1 个作者,多则不限
2) "+"加号表示出现 1-n 次

简介有没有都可以
2) "?"问号表示出现 0 或 1

错误演示
1) 书籍列表和"("间少空格
2) 全角的逗号“,”
3dtd 定义的“作者”和“书名”的顺序和 xml 文件中出现的顺序不一致

dtd 规则_属性(Attribute)
1) <!ATTLIST 标记名称 属性名称 属性类型>

2) BookNo CDATA #REQUIRED: 表示 BookNo 属性是必须的
3) BookNo CDATA #IMPLIED: 表示 isbn 属性不是必须的

---------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books[
<!ELEMENT books (java*,javascript*,(phone|email)*)>
<!ELEMENT java (name,author,price)>
<!ELEMENT javascript (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST java bookNo CDATA #REQUIRED>
]>
<books>
<java bookNo='1001'>
<name>think in java</name>
<author>张三</author>
<price>18</price>
</java>
</books>
---------------------------------------------

把 xml 文件和 DTD 分离
1 步骤 1:新建 book.dtd,把 DTD 部分保存在此文件中
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT books (java*,javascript*,(phone|email)*)>
<!ELEMENT java (name,author,price)>
<!ELEMENT javascript (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST java bookNo CDATA #REQUIRED>
2:xml 文件改为指定 DTD 文件为 book.dtd
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE books SYSTEM "book.dtd">

可扩展标记语言架构是以可扩展标记语言为基础的,它用于可替代文档类型定义(外语缩写:DTD);一份XML schema文件描述了可扩展标记语言文档的结构。

XML Schema的作用是定义一份XML文档的合法组件群,就像文档类型定义(外语缩写:DTD)的作用一样,一份XML Schema定义了:
可以出现在文档里的元素;
可以出现在文档里的属性;
哪些元素是子元素;
子元素的顺序;
子元素的数量;
一个元素应是否能包含文本,或应该是空的;
元素和属性的数据类型;
元素和属性的默认值和固定值。


Schema 文件的扩展名 xsd: XML Schema Difinition(简称 XSD,遵循 W3C 标准)


在程序中使用xml


DOM(Document Object Model 文档对象模型)
关键字:文档树(Document)
优点: 把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点: 如果文件比较大,内存有压力,解析的时间会比较长


SAX(Simple API for Xml 基于XML的简单API)
关键字:流(Stream)
把xml文件作为输入流,触发标记开始,内容开始,标记结束等动作
优点: 解析可以立即开始,速度快,没有内存压力
缺点: 不能对节点做修改


JDOM / DOM4J :目前市场上常用的2种解析XML文件的API
dom4j-1.6.1.jar 结合了DOM和SAX两种解析方式的优点

读取xml

SAXReader reader=new SAXReader();---获得解析器
File f=new File("src/book.xml");---指定解析文件
//构造文档树并且返回
Document document=reader.read(f);
//获得根元素
Element rootElement=document.getRootElement();
获得book元素
List<Element> list=rootElement.elements("book");
Iterator<Element> it=list.iterator();
//打印信息
while(it.hasNext()){
Element e=it.next();
System.out.println(e.elementText("title"));
System.out.println(e.elementText("author"));
System.out.println(e.elementText("price"));
}


打印属性

while(it.hasNext()){
Element e=it.next();
List att=e.attributes();
Iterator attit=att.iterator();
while(attit.hasNext()){
Attribute atts=(Attribute) attit.next();
System.out.println(atts.getName()+" "+atts.getValue());
}

}

Iterator attit=e.attributeIterator();----简写,直接写入Iterator

dom 4j写入xml文件
常用API方法:
1) 给元素增加子元素: elmt.addElement( "标记名称" ) ;
2) 给元素增加属性: elmt.addAttribute( "属性名" , "属性值" ) ;
3) 给叶子元素设值: elmt.setText( "元素值" ) ;

//1创建空文档
Document doc=DocumentHelper.createDocument();
//添加根元素
Element root=doc.addElement("书记列表");
//在根元素上添加元素

Element book=root.addElement("武侠小说");
Element title=book.addElement("书名");
Element author=book.addElement("作者");

//设置类容
title.setText("天龙八部");
author.setText("金庸");
//添加属性
book.addAttribute("bookNo","1001");
book.addAttribute("hot","true");


写入开始

//创建写入流用于写入数据
FileWriter writer=new FileWriter(fileName);
//设置编码格式
OutputFormat ou=OutputFormat.createPrettyPrint();
ou.setEncoding("gb2312");
//XMLWriter写出xml文件
XMLWriter xmlWriter=new XMLWriter(writer,ou);
xmlWriter.write(doc);
xmlWriter.close();


1) XPath:在XML文件中查找或定位信息的语言
XPath可以通过元素/属性/值来定位或导航
2) 节点(Node): 相当于XML文件中的元素
3) 指定条件定位元素的方式
注意导入jar包

1:获得解析器
SAXReader reder=new SAXReader();
Document doc=reder.read(fileName);
指定根目录
Node node=doc.selectSingleNode("/书籍列表");
获得元素


完整案例:
SAXReader reder = new SAXReader();
Document doc = reder.read("src/test/book.xml");
Node node = doc.selectSingleNode("/booklist");
List<Element> list = node.selectNodes("book");
for (Element e : list) {
System.out.println(e.elementText("title"));
System.out.println(e.elementText("author"));
System.out.println(e.elementText("price"));
System.out.println("------------");
}
获取指定元素的指定标题的值
System.out.println(e.element("title").attributeValue("lang"));
book属性的值System.out.println(e.attributeValue("id"));


1:查找所有中文书
过滤元素
List<Element> list=node.selectNodes("book/title[@lang='中文']");
for(Element e:list){
System.out.println(e.getStringValue());
System.out.println("------------");

}

2:查找书籍类型为武侠的书籍
List<Element> list=node.selectNodes("book[@type='武侠']");
3:查找价格大于60的书籍
List<Element> list=node.selectNodes("book[price>60]");
4:作者是金庸
List<Element> list=node.selectNodes("book[author='金庸']");
5:价格大于60并且国家是中国
List<Element> list=node.selectNodes("book[price>60 and title[@lang='中文']]");

原文地址:https://www.cnblogs.com/czg-123/p/5440909.html