XML
为什么使用XML
问题1:Windows系统的应用怎么和Linux系统中的应用交互数据
问题2:其它诸如此类跨平台、跨操作系统的数据交互问题……
使用XML解决。
XML概述
可扩展性标记语言(eXtensible Markup Language),文件扩展名.xml
用途:描述、传输数据
使用场合:
- 持久化数据存储
- 数据交换
- 数据配置
示例:person.xml
<?xml version="1.0" encoding="utf-8" ?>
<Person>
<ID>1002</ID>
<Name>曹操</Name>
<Age>20</Age>
<!--注释 -->
<ID>1001</ID>
<Name>周瑜</Name>
<Age>22</Age>
</Person>
XML语法
文档声明
在编写XML文档时,需要先使用文档声明,声明XML文档的类型。
最简单的声明语法:
<?xml version="1.0" ?>
用encoding属性说明文档的字符编码:
<?xml version="1.0" encoding="GBK" ?>
元素
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
包含标签体:<a>www.baidu.com</a>
不含标签体的:<a></a>, 简写为:<a/>
一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
<a>welcome to <b>www.baidu.com</a></b>
格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。
------------------------------------------------------------------------------------------------
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
<Name>
冰冰
</Name>
和
<Name>冰冰</Name>
------------------------------------------------------------------------------------------------
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
1名称可以含字母、数字以及其他的字符
2名称不能以数字或者标点符号开始
3名称不能以字符 “xml”(或者 XML、Xml)开始
4名称不能包含空格
使用浏览器验证文件格式有效性。
属性:
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
<Student name="zhangsan">
属性值一定要用双引号(")或单引号(')引起来
定义属性必须遵循与标签相同的命名规范
在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:
<Student>
<name>text</name>
</Student>
注释
Xml文件中的注释采用:“<!--注释-->” 格式。
注意:
1 XML声明之前不能有注释
2 注释不能嵌套
XML解析
XML解析方式
DOM解析
使用DOM4J(DOM for Java)实现DOM解析
Java:JAXP技术
SAX解析
Pull解析和Sax类似
DOM和SAX比较
DOM解析 (Document Object Model) 文档对象模型
易用性强,使用DOM时,将把所有的XML文档信息都存于内存中,并且遍历简单,支持XPath,增强了易用性。
效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用
支持增删改查
SAX解析(Simple API for Xml)
SAX是一个用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API
SAX模型最大的优点是内存消耗小
只适合读取
使用DOM4J解析
Dom for java
Dom4j是一个简单、灵活的开放源代码的库。Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。现在很多软件采用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。
使用Dom4j开发,需下载Dom4j相应的jar文件
项目中如何使用DOM4J
(1)项目中创建文件夹lib
(2)把jar包复制到lib目录中
(3)右键lib,Add AS Library,然后点OK
获取Document对象
SAXReader reader = new SAXReader();
Document document= reader.read(new File("input.xml"));
节点对象操作
1.获取文档的根节点.
Element root = document.getRootElement();
2.取得某个节点的子节点.
Element element=node.element(“书名");
3.取得节点的文字
String text=node.getText();
4.取得某节点下所有名为“member”的子节点,并进行遍历.
List nodes = rootElm.elements(“book");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Element elm = (Element) it.next();
}
节点属性操作
1.取得某节点下的某属性
Element root=document.getRootElement();
//属性名name
Attribute attribute=root.attribute("size");
2.取得属性的文字
String text=attribute.getText();
3.删除某属性
Attribute attribute=root.attribute("size");
root.remove(attribute);
案例1:读取xml文件
public static void readxml() throws Exception{
//1创建SaxReader
SAXReader reader=new SAXReader();
//2获取Document对象
Document document=reader.read(new FileReader("src\\books2.xml"));
//3获取根节点
Element root=document.getRootElement();//books
//System.out.println(root.getName());
//4获取book集合
List<Element> bookList=root.elements("book");
for (Element b : bookList) {
//System.out.println(b.getName());
//5获取属性
String id=b.attributeValue("id");
String name=b.element("name").getText();
String author=b.element("author").getText();
String price=b.elementText("price");
Book book=new Book(Integer.parseInt(id), name, author, Double.parseDouble(price));
System.out.println(book.toString());
}
}
案例2 写入XML文件
public static void writeXml() throws Exception{
//1 创建SaxReader
SAXReader reader=new SAXReader();
//2读取
Document document=reader.read(new FileReader("src\\books2.xml"));
//3获取根节点
Element root = document.getRootElement();
//4添加节点
Element newbook = root.addElement("book");
//5添加属性
newbook.addAttribute("id","1003");
//6newbook添加name author price
newbook.addElement("name").setText("android开发");;
newbook.addElement("author").setText("老张");;
newbook.addElement("price").setText("88.8");;
//7写入文件中
OutputFormat format=OutputFormat.createPrettyPrint();//创建一个漂亮的输出格式
format.setEncoding("utf-8");
XMLWriter writer=new XMLWriter(new FileWriter("src\\books2.xml"), format);
writer.write(document);
writer.close();
System.out.println("写入成功");
}
案例3 修改和删除xml文件
public static void updateXml() throws Exception{
//1创建Xmlreader
SAXReader reader=new SAXReader();
//2文档
Document document = reader.read(new FileReader("src\\books2.xml"));
//3获取根节点
Element root = document.getRootElement();
//4获取id=1003的book
List<Element> elements = root.elements("book");
Element bookEle = elements.get(2);
bookEle.element("name").setText("android从入门到大神");
Element first =elements.get(0);
//5删除
root.remove(first);
//6写入
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer=new XMLWriter(new FileWriter("src\\books2.xml"), format);
writer.write(document);
writer.close();
System.out.println("修改删除完毕");
}