XML
1.为什么要用xml文件:
- xml是用于传输和存储数据
- 其跨系统/平台/语言,不受限制,以相同的XML文件把不同的东西连接起来.结构清晰,通俗易懂
- 它的存储结构是:树形结构,xml文件中存储的内容就可以把它理解成是倒着的树形结构,即根节点在最上面,下面依次会有不同的子节点,而子节点又会长出更为细小的子节点.
2.什么是XML:
- XML 指可扩展标记语言(EXtensible Markup Language)
- XML 是一种标记语言,很类似 HTML
- XML 的设计宗旨是传输数据,而非显示数据
- XML 标签没有被预定义。您需要自行定义标签
- XML 被设计为具有自我描述性
- XML 是 W3C 的推荐标准
- XML 仅仅是纯文本,跨系统/平台/语言,不受限制
- XML 是不会做任何事情的,仅仅是包装在 XML 标签中的纯粹的信息
- XML 是独立于软件和硬件的信息传输工具
- XML 无所不在,是各种应用程序之间进行数据传输的最常用的工具,并且在信息存储和描述领域变得越来越流行。
3. XML的作用
#.可作为一种简单的数据库,存储并检索数据;
#.传输约定格式的文件;
#.做软件的配置文件.
4.XML实例:书店示例
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
由上我们可以看出头结点"bookstore",即这是一个书店.上面我们也说了XML我们是可以自己定义的.在"bookstore"下面有三个"book"子元素.
"book category=’’> "这个"category"我们称为属性
‘‘book’’ 元素有 4 个子元素:’‘title’’、’‘author’’、’‘year’’、’‘price’’。
注:在写XML正文之前,需要加一个声明,声明的格式是:
<?xml version="1.0" encoding="UTF-8"?> 包含版本,和字符集编码
5.XML的语法:
- 所有 XML 元素都须有关闭标签
- XML 标签对大小写敏感
- 简化写法,例如:< name >< /name> 可以简化为: < name />
- XML 必须正确地嵌套
- XML 文档必须有根元素:XML 文档必须有一个元素是所有其他元素的父元素。该元素称为根元素。
- XML 的属性都必须有值,且值须加引号
- 需要转义字符,如"<"需要用<来代替
- XML 中的注释
- 在 XML 中,空格会被保留,文档中的空格不会被删节。
6.XML解析:
解析就是获取XML文件的内容,获取节点名,节点值,属性名,属性值 .
通常有4中解析方式:
①.DOM: 文档对象模型,用于树结构,擅长(小规模)读/写
②.SAX: 流机制解析器,擅长读
③.DOM4J: JDOM的一种智能分支,它合并了许多超出基本XML文档表示的功能,它使用接口和抽象基本类方法。
④. JDOM: 仅使用具体类,而不使用接口
在使用DOM和SAX方式解析时,是不需要单独下载jar包的,但是当用JDOM和DOM4J时,需要单独下载jar包并导入到项目中
Final:比较总结
DOM4J性能最好,连Sun的JAXM也在用DOM4J。目前许多开源项目中大量采用DOM4J,例如大名鼎鼎的Hibernate也用DOM4J来读取XML配置文件。如果不考虑可移植性,那就采用DOM4J。
JDOM和DOM在性能测试时表现不佳,在测试10M文档时内存溢出。在小文档情况下还值得考虑使用DOM和JDOM。虽然JDOM的开发者已经说明他们期望在正式发行版前专注性能问题,但是从性能观点来看,它确实没有值得推荐之处。另外,DOM仍是一个非常好的选择。DOM实现广泛应用于多种编程语言。它还是许多其它与XML相关的标准的基础,因为它正式获得W3C推荐(与基于非标准的Java模型相对),所以在某些类型的项目中可能也需要它(如在JavaScript中使用DOM)。
SAX表现较好,这要依赖于它特定的解析方式-事件驱动。一个SAX检测即将到来的XML流,但并没有载入到内存(当然当XML流被读入时,会有部分文档暂时隐藏在内存中)。
DOM是W3C处理XML的标准API,因其直观易用,其处理方式是将XML整个作为类似树结构的方式读入内存中以便操作及解析和修改.但是在解析大数据量的XML文件会遇到内存泄露及程序崩溃的风险.
下面我们来解析一个小例子:
解析的目标是,在解析之后,java程序能够得到xml文件的所有数据.
步骤:
1.新建一个Project.-package-class
2.在项目中创建一个XMl文件或者复制一个XML文件到项目中
3.
4.分别获取里面的节点内容
public class DomTest {
public static void main(String[] args) {
//创建一个DocumentBuilderFactory的对象
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
//创建一个DocumentBuilder对象
try {
//创建DocumentBuilder对象
DocumentBuilder db = dbf.newDocumentBuilder();
//通过DocumentBuilder对象的Parse方法加载book.xml文件到当前项目下
Document document = db.parse("book.xml");
//获取所有Book节点的集合
NodeList bookList = document.getElementsByTagName("book");
//遍历Book节点
for (int i = 0; i < bookList.getLength(); i++) {
System.out.println("================开始遍历第"+ (i+1) + "本书的内容===============");
System.out.println("第" +(i+1)+ "本书的内容为:");
//获取每一个Book节点
Node book = bookList.item(i);
//获取Book节点所有属性集合
NamedNodeMap attrs = book.getAttributes();
//遍历book的属性
for (int j = 0; j < attrs.getLength(); j++) {
//获取book节点的属性
Node attr = attrs.item(j);
//获取属性名
System.out.print("属性名:" + attr.getNodeName());
//获取属性值
System.out.println(",属性值:" + attr.getNodeValue());
//解析book节点的子节点
NodeList childNodes = book.getChildNodes();
//遍历childNodes获取每个节点的节点名称和节点值
for (int k = 0; k < childNodes.getLength(); k++) {
//区分出text类型的node以及element类型的Node
if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
//获取Element类型的节点的节点名称
System.out.print("第"+ (k+1) +"个节点名称:" + childNodes.item(k).getNodeName());
//获取Element类型的节点的节点名称的值
System.out.println(",节点的值:" + childNodes.item(k).getFirstChild().getNodeValue());
}
}
}
System.out.println("================结束遍历第"+ (i+1) + "本书的内容===============");
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}