使用Dom4j解析xml
1. xml
概念:Extensible Markup Language
可扩展标记语言
可扩展:标签都是自定义的。
功能
存储数据
1. 配置文件
2. 在网络中传输
xml与html的区别
- xml标签都是自定义的,html标签是预定义。
- xml的语法严格,html语法松散
- xml是存储数据的,html是展示数据
基本语法:
- xml文档的后缀名 .xml
- xml第一行必须定义为文档声明
- xml文档中有且仅有一个根标签
- 属性值必须使用引号(单双都可)引起来
- 标签必须正确关闭
- xml标签名称区分大小写
简单实例
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
组成部分:
- 文档声明
- 格式:
- 属性列表:
* version:版本号,必须的属性
* encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
* standalone:是否独立
* 取值:
* yes:不依赖其他文件
* no:依赖其他文件
- 标签:标签名称自定义的
- 规则:
- 名称可以包含字母、数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能以字母 xml(或者 XML、Xml 等等)开始
- 名称不能包含空格
- 属性:
id属性值唯一 - 文本:
- CDATA区:在该区域中的数据会被原样展示
- 格式:
2. xml解析与写入
xml常见的解析器:
1. JAXP:sun公司提供的解析器,支持dom和sax两种思想
2. DOM4J:一款非常优秀的解析器
3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
4. PULL:Android操作系统内置的解析器,sax方式的。
使用dom4j解析xml
xml文件如下
<?xml version='1.0' ?>
<users error="none" code="success">
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<br/>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
解析xml
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class XmlDemo {
public static void main(String[] args) throws DocumentException {
//获取文档对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("user.xml"));
//获取根元素
Element root = doc.getRootElement();
System.out.println("获取到的根元素" + root);
//获取所有的子元素Love
List<Element> users = root.elements("user");
//输入name元素的内容
for (Element element : users) {
System.out.println("获取id属性:" + element.attribute("id").getValue());
System.out.println("获取name:" + element.elementTextTrim("name"));
System.out.println("获取age:" + element.elementTextTrim("age"));
System.out.println("获取gender:" + element.elementTextTrim("gender"));
System.out.println("---------------");
}
}
}
使用XPath快速查找
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.List;
public class XmlDemo {
public static void main(String[] args) throws DocumentException {
//获取文档对象
SAXReader reader = new SAXReader();
Document doc = reader.read(new File("user.xml"));
List<Node> list = doc.selectNodes("//user");
for (Node node : list) {
System.out.println(node.valueOf("name"));
}
System.out.println("------------");
Node node = doc.selectSingleNode("//user");
String id = node.valueOf("@id");
System.out.println(id);
System.out.println("------------");
Node node2 = doc.selectSingleNode("//user[@id='2']");
String name = node.valueOf("name");
System.out.println(name);
}
}
创建一个新的XML文档并写入本地
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.FileOutputStream;
import java.io.IOException;
public class XmlDemo {
public static void main(String[] args) throws IOException {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("root");
Element author1 = root.addElement("author")
.addAttribute("name", "James")
.addAttribute("location", "UK")
.addText("James Strachan");
Element author2 = root.addElement("author")
.addAttribute("name", "Bob")
.addAttribute("location", "US")
.addText("Bob McWhirter");
//设置写入xml为格式化的xml
OutputFormat format = OutputFormat.createPrettyPrint();
//设置写入的xml为压缩的xml
//OutputFormat format = OutputFormat.createCompactFormat();
XMLWriter writer = new XMLWriter(new FileOutputStream("new.xml"), format);
writer.write(document);
writer.close();
}
}
遍历迭代xml
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
public class XmlDemo {
public static void main(String[] args) throws DocumentException {
//获取文档对象
SAXReader reader = new SAXReader();
Document document = reader.read(new File("user.xml"));
Element root = document.getRootElement();
// iterate through child elements of root
for (Iterator<Element> it = root.elementIterator(); it.hasNext(); ) {
Element element = it.next();
// do something
System.out.println(element.elementTextTrim("name"));
}
System.out.println("----------------");
// iterate through child elements of root with element name "foo"
for (Iterator<Element> it = root.elementIterator("user"); it.hasNext(); ) {
Element user = it.next();
System.out.println(user.elementTextTrim("age"));
}
System.out.println("----------------");
// iterate through attributes of root
for (Iterator<Attribute> it = root.attributeIterator(); it.hasNext(); ) {
Attribute attribute = it.next();
// do something
System.out.println(attribute.getValue());
}
}
}