解析XML(一)
-
在进行XML文件的解析之前,我们简单介绍下什么是XML,以及XML在企业中有哪些作用。(本文建立在不使用数据库的前提之下,如果你正在使用数据库,或许并不需要学习本文)
-
什么是XML?
-
XML指可拓展标记语言
-
XML是一种标记语言,很类似HTML
-
XML的设计宗旨是传输数据,而非显示数据(显示数据应使用HTML及CSS)
-
XML标签没有被预定义 (意味着你可以创建出任何命名的标签,例如<QQ></QQ>,而HTML中并无此标签,但是建议尽可能少的使用中文)
-
-
XML有如下作用:
-
存储数据
-
传递数据,即服务器以XML的形式传输数据
-
软件配置,即通过配置XML文件,通知应用程序如何处理业务
-
在进行简单的介绍之后,我们便直接奔入主题吧。但在解析前,我们还需要下载并导入第三方jar包:dom4j-1.6.1.jar,该包是一种开源的XML解析包。
1.创建一个新的XML文件
public static void typ01() throws Exception{
//创建一个内存对象Document,它就表示硬盘中的xml文件
Document xmlDocument = DocumentHelper.createDocument();
//将内存中的对象Document写入硬盘,形成一个xml文件
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("D:/new.xml")));
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
该文件创建好之后(建议平时使用notepad++),内容如下:
该文件只包含XML版本解析器,以及编码。
用到的API如下:
Document DocumentHelper.createDocument()
XMLWriter xmlWriter = new XMLWriter(OutputStream os)
2.将符合XML格式的字符串转成xml文件
public static void type02()throws Exception{
//创建符合xml内容的字符串
String str ="<root><city>西安</city></root>";
Document xmlDocument = DocumentHelper.parseText(str);
//将内存中的document对象输出到硬盘,形成一个xml文件
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(new File("E:/new.xml")));
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
创建好之后,内容如下:
用到的API如下:
Document DocumentHelper.parseText(String text);
3.加载已存在的xml文件到内存,形成一个倒状的树结构,根就是Document对象
public static void type03() throws Exception {
//创建dom4j核心解析器
SAXReader saxReader = new SAXReader();
//读取硬盘的xml文件
Document xmldocument = saxReader.read(new File("E:/2.xml"));
//判断是否已经读到xml文件
System.out.println(xmldocument==null?"未读取到xml文件":"已读取到xml文件");
}
用到的API如下:
SAXReader new SAXReader();
Document new SAXReader.read(File file);
4.获取根节点的名字并获取根节点下的直接子节点的个数
首先我们在E盘中名为bookstore.xml的文件,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
<book id="first">
<title>JavaWeb</title>
<author>哈哈</author>
<price>49</price>
</book>
<book id="second">
<title>Web</title>
<author>哈哈</author>
<price>50</price>
</book>
</bookstore>
public static void main(String[] args)throws Exception {
//创建dom4j解析器对象
SAXReader saxReader = new SAXReader();
//通过字节流加载硬盘中的xml文件到内存
Document xmlDocument = saxReader.read(new FileInputStream(new File("E:/bookstore.xml")));
//获取根节点
Element rootElement = xmlDocument.getRootElement();
//显示根节点的名字
System.out.println(rootElement.getName());
//获取根节点下的直接子节点的个数和名字
List<Element> list = rootElement.elements("book");
System.out.println("根节点下有"+list.size()+"直接子节点");
}
输出如下:
用到的API如下:
Element getRootElement()
String getName()
List elements(String nodeName)
5.解析所有book节点属性值并解析所有book节点下子节点的内容
public static void main(String[] args)throws Exception {
//创建dom4j解析器对象
SAXReader saxReader = new SAXReader();
//通过字节流加载硬盘中的xml文件到内存
Document xmlDocument = saxReader.read(new FileInputStream(new File("E:\\bookstore.xml")));
//获取根节点
Element rootElement = xmlDocument.getRootElement();
//获取根节点写所有book字节点形成的集合
List<Element> list = rootElement.elements("book");
//迭代
for(Element element : list) {
//获取book节点的id属性值
String id = element.attributeValue("id");
//分别获取book节点的title/author/price子节点的内容
String title = element.element("title").getText().trim();
String author = element.element("author").getText().trim();
String price = element.element("price").getText().trim();
//将来我们可以将上述属性值封装到JavaBean对象中的所有属性中,
//加入到List<JavaBean>集合中
System.out.println(id+":"+title+" "+author+" "+price);
System.out.println("-------");
}
}
用到的API如下:
String attributeValue(String attributeName)
Element element(String nodeName)
6.修改节点的属性、修改节点中的内容并再次写回文件中
该案例通过类加载器读取src中的xml文件,内容如下:
public class Demo04 {
public static void main(String[] args) throws Exception {
//创建dom4j解析器对象
SAXReader saxReader = new SAXReader();
//创建InputStream对象
InputStream is =
Demo04.class.getClassLoader().getResourceAsStream("bookstore.xml");
//通过字节流,加载硬盘中的xml文件到内存
Document xmlDocument = saxReader.read(is);
//获取根节点
Element rootElement = xmlDocument.getRootElement();
//获取根节点下所有book子节点形成的集合
List<Element> list = rootElement.elements("book");
//跌倒
for(Element element : list) {
//如果book节点的id属性值是"java01"的话
if(element.attributeValue("id").equals("java01")) {
//修改book节点的id属性值
element.addAttribute("id", "java0001");
}
//如果book节点子节点price的内容为222的话
if(element.element("price").getText().equals("222")) {
//修改book节点price子节点内容
element.element("price").setText("333");
}
}
//上述修改只在内存中,还得将内存中的document对象写入硬盘
//紧缩格式:createCompactFormat()
//优美格式:createPrettyPrint()
OutputFormat format = OutputFormat.createPrettyPrint();
//指定xml编码
//format.setEncoding("gbk"); 通常并不使使用该函数
OutputStream os = new FileOutputStream(new File("D:\\bookstore.xml"));
XMLWriter xmlWriter = new XMLWriter(os,format);
xmlWriter.write(xmlDocument);
xmlWriter.close();
}
}
文件采用优美格式如下:
文件采用紧缩格式如下:
用到的API如下:
addAttribute(String attributeName,String attributeValue)
createCompactFormat()
createPrettyPrint()
XMLWriter(OutputStream out,OutputFormat format);