XML语言的使用和文件的解析

XML概述

XML是一种可扩展性标记语言(eXtensible Markup Language),文件扩展名.xml

用途:描述、传输数据

使用场合:

  • 持久化存储数据
  • 数据交换
  • 数据配置

XML的语法和格式

<?xml version="1.0" encoding="UTF-8" ?>
<!--注释格式,开头XML声明语句-->
<!--必须有且仅有一个根元素,标签大小写敏感-->
<Students>
    <!--【属性值】使用双引号-->
    <Student id="2002">
        <!--标签成对,且元素要正确嵌套,不允许交叉嵌套-->
        <name>张三</name>
        <age>28</age>
        <class>12班</class>
        <!--不含标签体的可以简写-->
        <dcr/>
    </Student>
    <Student id="2003">
        <name>李四</name>
        <age>25</age>
        <class>14班</class>
    </Student>
</Students>

一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:

  1. 名称可以含字母、数字以及其他的字符
  2. 名称不能以数字或者标点符号开始
  3. 名称不能以字符 “xml”(或者 XML、Xml)开始
  4. 名称不能包含空格
    使用浏览器验证文件格式有效性。

XML解析

对XML文件的解析方式:

  1. 使用DOM4J(DOM For Java)实现DOM解析
  2. JAXP技术(废弃)
  3. SAX解析
  4. Pull解析,与SAX解析类似

DOM和SAX解析方式比较

DOM解析 (Document Object Model) 文档对象模型
(1)易用性强,使用DOM时,将把所有的XML文档信息都存于内存中,并且遍历简单,支持XPath,增强了易用性
(2)效率低,解析速度慢,内存占用量过高,对于大文件来说几乎不可能使用
(3)支持增删改查
SAX解析(Simple API for Xml)
(1)用于处理XML事件驱动的“推”模型,虽然它不是W3C标准,但它却是一个得到了广泛认可的API
(2)最大的优点是内存消耗小
(3)只适合读取

使用DOM4J解析

Dom4j是一个简单、灵活的开放源代码的库。Dom4j是一个非常优秀的Java XML API,具有性能优异、功能强大和极易使用的特点。
使用Dom4j开发,需下载Dom4j相应的jar文件。

项目中如何使用DOM4J
IDEA配置:
(1)项目中创建文件夹lib
(2)把jar包复制到lib目录中
(3)右击lib文件夹—>Add as Library
Eclipse配置:
(1)项目中创建文件夹lib
(2)把jar包复制到lib目录中
(3)右击jar包—>build path—>add to build path

读写改删操作
DOM是一种树结构,上面的XML例子中,根节点就是Students,其叶子节点是Student,属性是子子节点,所以解析过程也是要从跟节点开始,逐步解析。

1、增加操作
//创建SAXReader类对象,然后使用read方法读取
SAXReader reader = new SAXReader();
Document document= reader.read(new File("input.xml"));

//获取根节点
Element root = document.getRootElement();

//根节点下添加元素
Element book = root.addElement("book");

//添加book的【属性值】
book.addAttribute("id", "1008");

//添加子子节点
book.addElement("name").setText("《九阳真经》");
book.addElement("author").setText("张无忌");
book.addElement("price").setText("89.9");

//添加的结果还在内存,这里需要写入到文件
//1.创建输出格式
OutputFormat outputFormat = OutputFormat.createPrettyPrint();
outputFormat.setEncoding("utf-8");

//2.创建XMLWriter格式文件
XMLWriter writer = new XMLWriter(new FileWriter("input.xml"), outputFormat);

//3.写入和关闭
writer.write(document);
writer.close();
2、删改操作
//1.创建SaxReader
SAXReader reader = new SAXReader();
//2.读取
Document document = reader.read(new FileReader("input.xml"));
//3.获取根节点
Element root = document.getRootElement();
//4.修改元素
List<Element> bookList = root.elements("book");
Element firstBook = bookList.get(0);
firstBook.element("price").setText("101");
Element secondBook = bookList.get(1);
secondBook.element("price").setText("120");
//5.删除最后一个
root.remove(bookList.get(bookList.size() - 1));
//6.写入文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
XMLWriter writer = new XMLWriter(new FileWriter("input.xml"), format);
//7.写入
writer.write(document);
//8.关闭
writer.close();
3.读取操作
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) {
		//5获取【属性值】
		String id=b.attributeValue("id");
		//6.获取子子节点
		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());
	}
}

基本操作方式就是用SAXReader读取文件、获取根节点、然后使用element方法获取子节点和子子节点等等,最后使用XMLWriter写入文件

XML文件解析失败问题

XML解析失败,主要是因为BOM头问题导致的,详见转换流和系统缓冲流的使用——基本使用

解决办法就是使用 notepad++ 打开,然后在上面的 “编码” 选项中选择 “使用UTF-8编码”,保存即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值