XML
XML语法
XML的含义
1.XML是可扩展的标记语言,是一种常用的数据结构,用于简化的数据的存储和共享
2.是统一的标准文件格式,方便数据文件的交换
3.采用文本格式,统一了编码,方便直接联系
4.有统一的API,使用简单
标记
tag标记,标签
语法:开始标记<标记名>
结束标记</标记名>
标记名称,任意名称
一般都是英文
区分大小写
标记必须配对使用
不能使用单标记
标记可以嵌套,但是不能交叉嵌套
一个XML文件中只能有一个根标记
注释
注:XML文件中只能用XML注释,不能使用Java注释
内容
- 开始标记和结束标记之间的部分称为“内容“
- 文本内容:文字信息
- 子标记:嵌套在标记中的标记
- 标记和文本的混合体
元素
Element元素:开始标记+内容+结束标记的整体称为元素
- 标记的名也称为元素的名
- 一个XML文件中只有一个“根元素”
属性
Attribute属性:在开始标记上定义的key="value"称为元素的属性
- 在开始标记(标签)上定义
- 属性结构key=“value”
- 属性没有顺序,属性名不能重复
- 属性值必须使用引号
- 属性等号两边不要有空格,属性之间要有空格!
优点
1.可以任意扩展,描述数据,是通用的数据格式
2.严格的语法规定,可以使用通用的API解析,简化编程,提高开发效率
特殊符号
<:< >:> &:& ':&apos ":"
空格:  版权:© 注册商标:® 商标:&trade
XML和HTML的区别
HTML相当于规定了标签名称,规定了标签嵌套相关的一种XML
XML解析
用编程语言读取XML文件中的内容,并且识别其中的语法,找到根元素,识别子元素,读取元素的文本内容等。
Dom4J API
开源的API
Maven包管理
1.Maven是项目管理工具,管理一个项目的生命周期,Maven功能非常强大。
2.Maven包管理功能:可以自动下载使用开源的API包。
3.使用步骤:
(1)配置国内的Maven仓库
(2)利用Maven搜索引擎,找到组件坐标
(3)将坐标放到pom文件中,自动下载组件
XML解析方式
xml的解析方式:
(1)SAX(Simple API for xml)解析:是一种速度快,更有效的方法,边扫描边解析,可在解析文档的任意时刻停止解析。
优点:解析立刻停止,速度快,没有内存压力
缺点:不能对节点进行修改SAX(与w3c没有任何关系)是解析xml的一种接口,以流的方式将xml文档读取到内存中,以事件模型的方式解析处理xml文档,获取xml文档中的内容。支持sax接口的解析器很多,但是没有一个主流的浏览器内置xml解析器支持SAX接口。
SAX解析方式
1.获取工厂实例;
2.得到解析器;
3.得到读取器;
4.设置内容处理器;
(一)第一步:新建一个工厂类SAXParserFactory,代码如下: SAXParserFactory factory = SAXParserFactory.newInstance();
(二)第二步:让工厂类产生一个SAX的解析类SAXParser,代码如下: SAXParser parser = factory.newSAXParser();
(三)第三步:从SAXPsrser中得到一个XMLReader实例,代码如下: XMLReader reader = parser.getXMLReader();
(四)第四步:把自己写的handler注册到XMLReader中,一般最重要的就是ContentHandler,代码如下: reader.setContentHandler(this);
(五)第五步:将一个xml文档或者资源变成一个java可以处理的InputStream流后,解析正式开始,代码如下:
reader.parse(new InputSource(is));
实例
<books>
<!-- 开始标记 -->
<book id="b1" lang="zh">
<name><18&岁的我></name>
<author>冯唐</author>
</book>
<book lang="zh" id="b2">
<name>檀香刑</name>
<author>莫言</author>
</book>
<book id="b3" lang="zh">
<name>我的日子</name>
<author>三十</author>
<note>
<![CDATA[
这是一个段话 可以 使用任何符号
age > 30 & times < 50
]]>
</note>
</book>
</books>
<!-- 结束标记 -->
<!-- 根标记只能有一个 -->
解析案例
import java.io.FileInputStream;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo01 {
public static void main(String[] args)
throws Exception {
/*
* 打开XML文件
*/
String filename = "demo.xml";
FileInputStream fis=new FileInputStream(filename);
/*
* 利用Dom4J提供的高级流,读取fis
* reader.read(fis) 将低级流fis中的文件
* 数据解析为一个对象 doc。对象中包含demo.xml 中的全部数据
*/
SAXReader reader = new SAXReader();
Document doc = reader.read(fis);
fis.close();//关闭流
//doc.asXML 输出 doc 对象中的信息
//System.out.println(doc.asXML());
/*
* Document 对象提供了获取根元素的方法
* Element 元素
* doc.getRootElement() 返回根元素对象
*/
Element root=doc.getRootElement();
System.out.println(root.asXML());
/*
* 利用Root Element 可以读取XML文件中
* 的全部内容
* 元素上提供了获取其内部一组子元素的方法
* root.elements("root")
*
* 读取全部书的名字
*
* 获取一个子元素
* e.element("name")
*
* List<泛型> 泛型的用途约束集合中元素类型
* 可以完成自动类型转换
* List<Element>
*/
List<Element> list=root.elements("book");
for(Element e:list) {
//e 就是 book 元素
//System.out.println(e.asXML());
//在e元素上获取一个叫“name”的子元素
//Element n = e.element("name");
//获取元素上的文字,并且去除前后空白
//String name = e.element("name").getTextTrim();
// e.element("name").getTextTrim() 完全相当于
// e.elementTextTrim("name")
String name=e.elementTextTrim("name");
String author=e.elementTextTrim("author");
System.out.println(name+"-"+author);
/*
* 在元素上读取属性:
* 属性值 = e.attributeValue(属性名)
*/
String id = e.attributeValue("id");
System.out.println(id);
Element note = e.element("note");
if(note!=null) {
System.out.println(note.getTextTrim());
}
}
}
}