1.XML解析
<?xml version="1.0" encoding="utf-8"?>
<!--首行是xml的声明 -->
<country name="中国">
<!-- 写在标签内的是标签的属性 -->
<province name="湖南" id="01">
<capital>changsha</capital>
<!-- 写在标签开始结尾内的是标签的文本 -->
<area>30</area>
<population>1000</population>
</province>
<province name="湖北" id="02">
<capital>wuhan</capital>
<area>35</area>
<population>2000</population>
</province>
<province name="广东" id="03">
<capital>广州</capital>
<area>40</area>
<population>3000</population>
</province>
</country>
<!-- 这是xml的注释 -->
<!--
标签:
xml文件包括标签和属性,标签本身可以有属性,如province的name属性,同时标签可以有子标签,
比如province的子标签有capital,area,population等,
转义字符:
< <
> >
" "
& &
空格 &nsbp;
-->
<!--
CDATA块:
作用: 可以让一些需要进行包含特殊字符的内容统一进行原样输出。-->
<!-- xml解析方法:
DOM:Dom4J(使用广泛,不在jdk中,dom4j-1.6.1.jar), JAXP (oracle-Sun公司官方)
DOM解析原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,
通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
SAX:Sax解析工具(oracle-sun公司官方)
-->
package p01;
import java.io.File;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Demo1 {
public static void main(String[] args) throws DocumentException {
//showXml();
//showXmlParams();
//showXmlAttr();
//showXmlEle();
//showXmlAll();
//SAXReader reader = new SAXReader();
//Document document = reader.read(new File("./src/country.xml"));
//Element rootEle = document.getRootElement();
//getNodes(rootEle);
showAll();
}
private static void showAll() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("./src/country.xml"));
Iterator<Element> it = document.getRootElement().elementIterator("province");
while(it.hasNext()){
Element ele = it.next();
Province pro = new Province();
pro.setCapital(ele.elementText("capital"));
pro.setArea(ele.elementText("area"));
pro.setPopulation(ele.elementText("population"));
System.out.println(pro.toString());
}
}
/**
* 递归显示所有的节点
* */
private static void getNodes(Element ele) {
System.out.println(ele.getName()+"###"+ele.getText());
Iterator<Node> it = ele.nodeIterator();
while(it.hasNext()){
Node node = it.next();
if(node instanceof Element){
getNodes((Element)node);
}
}
}
/**
* 显示所有的节点
* 节点node分为标签(Element,)属性,文本,只有标签包含子节点,其余两个没有
* */
private static void showXmlAll() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("./src/country.xml"));
Iterator<Node> it = document.nodeIterator();
while(it.hasNext()){
Node node = it.next();
System.out.println(node.getName()+"!!!!" +node.getText() );
}
}
/**
* 获取xml文件的节点标签
* 获取节点之后,才能进一步获取对应的属性,文本(无子标签时一般包含文本值)
* @throws DocumentException
* */
private static void showXmlEle() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("./src/country.xml"));
Element rootEle = document.getRootElement();
System.out.println("根标签的名字:"+rootEle.getName());
//得到根标签下的指定名称的第一个子标签
Element ele1 = rootEle.element("province");
System.out.println(ele1.elementText("capital")+
"--"+ele1.elementText("area")+"--"+ele1.elementText("population"));
System.out.println("-----------------");
//得到根标签下的指定名称的所有子标签
Iterator<Element> it = rootEle.elementIterator();
while(it.hasNext()){
Element ele = it.next();
System.out.println(ele.elementText("capital")+
"--"+ele.elementText("area")+"--"+ele.elementText("population"));
}
System.out.println("-------------");
//得到根标签下的所有子标签
List<Element> list = rootEle.elements();
for (Element element : list) {
System.out.println(element.getName());
}
System.out.println("-----------------");
//链式获取深层标签
Element ele3 = rootEle.element("province").element("population");
System.out.println(ele3.getName()+"--"+ele3.getText());
}
/**
* 获取属性,
* 获取属性前要先获取对应的节点标签
* */
private static void showXmlAttr() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("./src/country.xml"));
Element ele1 = document.getRootElement().element("province");
//方法1,直接获取节点的属性值
String str1 = ele1.attributeValue("name");
String str2 = ele1.attributeValue("id");
System.out.println("方法1:"+str1 +"--------" +str2);
//方法2,根据属性名获取属性对象,得到属性的属性名和属性值
Attribute attr1 = ele1.attribute("name");
String key1 = attr1.getName();
String value1 = attr1.getValue();
System.out.println("方法2:"+key1 +"--------" +value1);
//方法3,得到所有属性对象返回List集合
List<Attribute> list = ele1.attributes();
System.out.println("------方法3--------");
for (Attribute att : list) {
System.out.println(att.getName()+"=="+att.getValue());
}
//方法4,得到所有属性对象返回迭代器
Iterator<Attribute> it = ele1.attributeIterator();
System.out.println("------方法4--------");
while(it.hasNext()){
Attribute attr2 = it.next();
System.out.println(attr2.getName()+"=="+attr2.getValue());
}
}
/**
* 获取文本
* 获取文本前先获取对应的节点标签
* */
private static void showXmlParams() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("./src/country.xml"));
//Element ele = document.getRootElement().getText();
String text = document.getRootElement().getText();
//System.out.println("text1:" + text1);
Element rootEle = document.getRootElement();
//获取元素的文本,
//根据元素名称获取节点,默认获取第一个
Element ele1 = rootEle.element("province");
String capital_1 = ele1.element("capital").getText();
String area_1 = ele1.element("area").getText();
String population_1 = ele1.elementText("population");
//elementText相当于element()和getText()两个方法的结合
System.out.println(capital_1 + "---" + area_1 + "---" + population_1);
}
/**
* 获取文档树对象
* */
private static void showXml() throws DocumentException {
SAXReader reader = new SAXReader();
Document document = reader.read(new File("./src/country.xml"));
System.out.println(document);
}
}
总结:
xml的dom解析方法,操作类型分为节点,标签,属性,文本,后三者统称为节点,只有标签可以有子节点,其余二者不可以有子节点;
操作节点:可以通过获取节点的迭代器来遍历
操作标签:可以获取指定名称的第一个标签,也可以获取指定名称的所有标签
操作属性:通过标签获取其属性,可以通过属性名称获取,也可以先获取属性对应,在获取属性名和属性值,
操作文本:可以通过标签获取文本,也可以通过标签名字直接获取标签的文本