java基础之XML
程序员文章站
2024-01-05 17:37:10
java基础之XML 1. XML解析概述 2. DOM4J介绍 2.1 常用包 2.2 内置元素 2.2 Element类 2.3 Attribute类 2.4 常用操作 3. 代码演示 3.1 DOM4J读取xml文件 3.2 DOM4J创建xml文件 3.2 DOM4J修改xml文件 ......
目录
java基础之xml
xml是一种通用的数据交换格式,它的平台无关性、语言无关性、系统无关性、给数据集成与交互带来了极大的方便。本篇文章重点介绍dom4j对xml文件的一些操作。
1. xml解析概述
常见解析方式和解析器
- dom:要求解析器把整个xml文档装载到内存,并解析成一个document对象。
优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
缺点:xml文档过大,可能出现内存溢出显现。
- sax:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
优点:处理速度快,可以处理大文件
缺点:只能读,逐行后将释放资源。
2. dom4j介绍
2.1 常用包
包名 | 作用 |
---|---|
import org.dom4j.document; | document文档类 |
import org.dom4j.element | 元素节点类 |
import org.dom4j.qname; | 一个对元素名字的封装类 |
import org.dom4j.io.saxreader; | sax读取类 |
import org.dom4j.io.xmlwriter | xml写入类 |
import org.dom4j.io.outputformat | 输出格式 |
2.2 内置元素
元素 | 含义 |
---|---|
attribute | 定义了 xml 的属性。 |
branch | 指能够包含子节点的节点。如xml元素(element)和文档(docuemnts)定义了一个公共的行为 |
cdata | 定义了 xml cdata 区域 |
characterdata | 是一个标识接口,标识基于字符的节点。如cdata,comment, text. |
comment | 定义了 xml 注释的行为 |
document | 定义了xml 文档 |
documenttype | 定义 xml doctype 声明 |
element | 定义xml 元素 |
elementhandler | 定义了element 对象的处理器 |
elementpath | 被 elementhandler 使用,用于取得当前正在处理的路径层次信息 |
entity | 定义 xml entity |
node | 为dom4j中所有的xml节点定义了多态行为 |
nodefilter | 定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate) |
processinginstruction | 定义 xml 处理指令 |
text | 定义 xml 文本节点 |
visitor | 用于实现 visitor模式 |
xpath | 在分析一个字符串后会提供一个 xpath 表达式 |
2.2 element类
方法 | 含义 |
---|---|
getqname() | 元素的qname对象 |
getnamespace() | 元素所属的namespace对象 |
getnamespaceprefix() | 元素所属的namespace对象的prefix |
getnamespaceuri() | 元素所属的namespace对象的uri |
getname() | 元素的local name |
getqualifiedname() | 元素的qualified name |
gettext() | 元素所含有的text内容,如果内容为空则返回一个空字符串而不是null |
gettexttrim() | 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null |
attributeiterator() | 元素属性的iterator,其中每个元素都是 |
2.3 attribute类
方法 | 含义 |
---|---|
attributevalue() | 元素的某个指定属性所含的值 |
elementiterator() | 元素的子元素的iterator,其中每个元素都是element对象 |
element() | 元素的某个指定(qualified name或者local name)的子元素 |
elementtext() | 元素的某个指定(qualified name或者local name)的子元素中的text信息 |
getparent() | 元素的父元素 |
getpath() | 元素的xpath表达式,其中父元素的qualified name和子元素的qualified name之间使用”/”分隔 |
istextonly() | 是否该元素只含有text或是空元素 |
isrootelement() | 是否该元素是xml树的根节点 |
2.4 常用操作
- 读取xml文件,获得document对象.
saxreader reader = new saxreader(); document document = reader.read(new file("***.xml"));
- 解析xml形式的文本,得到document对象.
string text = "<members></members>"; document document = documenthelper.parsetext(text);
- 获取根节点
element root = dom.getrootelement();
- 取得某节点的单个子节点
element memberelm=root.element("title");
- 获取节点文字
string text=memberelm.gettext();
- 取得某节点下名为"title"所有字节点并进行遍历
list list = rootelm.elements("member"); iterator<element> it = list.iterator(); while(it.hasnext()){ element elm = it.next(); // do something... }
- 在某节点下添加子节点.
element ageelm = newmemberelm.addelement("age");
- 设置节点文字.
ageelm.settext("29");
- 删除某节点.
parentelm.remove(childelm);
- 取得某节点下的某属性
element root=document.getrootelement(); attribute attribute=root.attribute("id");
- 设置某节点的属性和文字.
newmemberelm.addattribute("name", "sitinspring");
- 设置属性的文字
attribute attribute=root.attribute("name"); attribute.settext("sitinspring");
- 删除某属性
attribute attribute=root.attribute("size");// 属性名name root.remove(attribute);
3. 代码演示
3.1 dom4j读取xml文件
test.xml
<?xml version="1.0" encoding="utf-8"?> <bookstore> <book id="1"> <title>巴黎圣母院</title> <author>雨果</author> </book> <book id="2"> <title>飘</title> <author>米切尔</author> </book> </bookstore>
1. 使用list列表解析xml
import java.io.file; import java.util.list; import org.dom4j.attribute; import org.dom4j.document; import org.dom4j.element; import org.dom4j.io.saxreader; public class xmldemo { public static void main(string[] args) throws exception { saxreader reader = new saxreader(); file file = new file("test.xml"); document document = reader.read(file); element root = document.getrootelement(); list<element> childelements = root.elements(); for (element child : childelements) { //已知属性名情况下 system.out.println("--->id: " + child.attributevalue("id")); system.out.println("title:" + child.elementtext("title")); system.out.println("author:" + child.elementtext("author")); //未知属性名情况下 /*list<attribute> attributelist = child.attributes(); for (attribute attr : attributelist) { system.out.println(attr.getname() + ": " + attr.getvalue()); } list<element> elementlist = child.elements(); for (element ele : elementlist) { system.out.println(ele.getname() + ": " + ele.gettext()); } system.out.println();*/ } } } //输出结果: --->id: 1 title:巴黎圣母院 author:雨果 --->id: 2 title:飘 author:米切尔
2. 使用iterator解析xml
public class xmldemo { public static void main(string[] args) throws exception { saxreader reader = new saxreader(); document document = reader.read(new file("test.xml")); element root = document.getrootelement(); iterator<element> it = root.elementiterator(); while (it.hasnext()) { element element = it.next(); //未知属性名称情况下 iterator<element> attrit = element.attributeiterator(); while (attrit.hasnext()) { attribute a = (attribute) attrit.next(); system.out.println(a.getvalue()); } iterator<element> eleit = element.elementiterator(); while (eleit.hasnext()) { element e = eleit.next(); system.out.println(e.getname() + ": " + e.gettext()); } system.out.println(); //已知元素名情况下 /*system.out.println("id: " + element.attributevalue("id")); system.out.println("title: " + element.elementtext("title")); system.out.println("author: " + element.elementtext("author")); system.out.println();*/ } } } //输出结果: id: 1 title:巴黎圣母院 author:雨果 id: 2 title:飘 author:米切尔
3.2 dom4j创建xml文件
public class xmldemo { public static void main(string[] args) throws exception { document doc = documenthelper.createdocument(); //增加根节点 element books = doc.addelement("bookstore"); //增加子元素 element book1 = books.addelement("book"); element title1 = book1.addelement("title"); element author1 = book1.addelement("author"); element book2 = books.addelement("book"); element title2 = book2.addelement("title"); element author2 = book2.addelement("author"); //为子节点添加属性 book1.addattribute("id", "3"); //为元素添加内容 title1.settext("战争与和平"); author1.settext("列夫托尔斯泰"); book2.addattribute("id", "4"); title2.settext("红楼梦"); author2.settext("曹雪芹"); //实例化输出格式对象 outputformat format = outputformat.createprettyprint(); //设置输出编码 format.setencoding("utf-8"); //创建需要写入的file对象 file file = new file("test2.xml"); //生成xmlwriter对象,构造函数中的参数为需要输出的文件流和格式 xmlwriter writer = new xmlwriter(new fileoutputstream(file), format); //开始写入,write方法中包含上面创建的document对象 writer.write(doc); } }
运行结果(项目根目录下):
<?xml version="1.0" encoding="utf-8"?> <bookstore> <book id="3"> <title>战争与和平</title> <author>列夫托尔斯泰</author> </book> <book id="4"> <title>红楼梦</title> <author>曹雪芹</author> </book> </bookstore>
3.2 dom4j修改xml文件
public class xmldeml { public static void main(string[] args) throws exception { saxreader reader = new saxreader(); file file = new file("test.xml"); document document = reader.read(file); element root = document.getrootelement(); element nameelement = root.element("book").element("author"); nameelement.settext("鲁迅"); //写回xml文档 outputformat format = outputformat.createprettyprint(); xmlwriter writer = new xmlwriter(new fileoutputstream("test.xml"), format); writer.write(document); writer.close(); } }
运行结果(项目根目录下):
<?xml version="1.0" encoding="utf-8"?> <bookstore> <book id="1"> <title>巴黎圣母院</title> <author>鲁迅</author> </book> </bookstore>