如何用DOM4J解析XML
认识XML
XML是Extensible Markup Language 即可扩展标记语言的缩写,是一种简单的数据储存语言,使用一系列简单的标记来描述数据
<element_name attribute_name="value" .../> // 自闭合 <element_name attribute_name="value" ...> //对 1-String 2-<element_name attribute_name="value" .../> 3-<element_name attribute_name="value" .../> ... </element_name> </element_name> 对
XML的四种解析
目前常用的XML解析技术有4种:
(1)DOM
DOM是基于XML的树结构来完成解析的,DOM解析XML的方式非常适用于多次访问XML的应用程序,但是其比较消耗资源;
(2)SAX
SAX是一种基于事件的解析,其主要是为了解决DOM解析的资源消耗问题而出现的,其优势是占用资源少,内存消耗小,一般在处理解析数据量大的XML文档才会使用
(3)JDOM
JDOM的目的是直接为JAVA编程服务,利用纯Java技术对XML文档实现解析生成,序列化以及其他操作;
(4)DOM4J
DOM4J具有性能优异、功能强大和易用的特点,同时它也是一个开放源代码的软件
如何用DOM4J解析XML数据
注:使用DOM4J解析XML,依赖于jar包 dom4j和jaxen
实现的步骤:
指定要解析的XML文件;
把XML文件转换成Document对象;
获取节点属性或文本的值。
File xml = new File("xmlfiles/xxx"); SAXReader reader = new SAXReader(); Document doc = reader.read(xml);//转换为文件 Element root = doc.getRootElement();//获取节点属性 List<Element> elements = root.elements(); //element 节点
下面举一例分别分析xml文档
xml文档内容如下
<?xml version="1.0" encoding="UTF-8"?> <root> <student id="1"> <name>张飞</name> <age>999</age> <gender>男</gender> </student> <student id="2"> <name>关羽</name> <age>888</age> <gender>男</gender> </student> <student id="3"> <name>刘备</name> <age>777</age> <gender>男</gender> </student> </root>
若要读取XML文档中,可以直接用字符串输出的方式遍历,首先获取子元素,再遍历子元素文本
//字符串输出 for (Element element : elements) { String id = element.attributeValue("id");//获取当前指定子元素 System.out.print(id+"\t"); List<Element> subEs = element.elements(); for (Element subE : subEs) { System.out.print(subE.getText()+"\t");//获取当前子元素文本 } System.out.println("\n"); }
对于一个XML文档,我们也许需要检索所有的内容,但有时也可能需要检索某一固定节点或某一个属性,因此我们需要采取不同的检索方式
(1)当我们需要检索所有内容时,可以用动态数组的形式遍历出来即可;
(2)当需要检索某一固定节点
Node node = document.selectSingleNode("//nodeName[@attrName = value]");
(3)检索某一属性(多节点检索)
List<Element> = document.selecNodes("//nodeName[subEleName/text()='value']");
取一分析结果,输出如下
//检索固定节点 Node node = doc.selectSingleNode("//student[@id=3]");//任意以student为根的节点 if (null != node){ Element element =(Element)node; String id = element.attributeValue("id"); String name = element.elementText("name"); String age = element.elementText("age"); String gender = element.elementText("gender"); Student student = new Student(Integer.parseInt(id),name,Integer.parseInt(age),gender); System.out.println(student); }
当我们需要对XML文件进行改动时,有三种情况分别为新增、删除以及修改(变动过之后必须落盘)
(1)新增
Element ele = root.addElement(...);
Element subEle = ele.addElement(String nodeName);
(2)删除
Element xxx = ...
father.renmove(xxx);
(3)修改
xxx.attribute(String attrName).setValue(String value);
xxx.element(String subName).setText(String text);
下面例子为删除操作
//删除 //内存操作 Node node = doc.selectSingleNode("//xxx[@id=3]"); if (null != node){ root.remove(node); //存盘 OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer = new XMLWriter(new OutputStreamWriter( new FileOutputStream("xmlfiles/kb.xml"),"UTF-8"),format); writer.write(doc); writer.flush(); writer.close(); }else { System.out.println("用户不存在"); }