认识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("用户不存在");
}