dom4j读取某个元素的某个属性
⼀、dom4j介绍
dom4j是⼀个Java的XML API,类似于jdom,⽤来读写XML⽂件的。dom4j是⼀个⾮常⾮常优秀的Java XML API,具有性能优异、功能强⼤和极端易⽤使⽤的特点,同时它也是⼀个开放源代码的软件,可以在SourceForge上到它。在IBM developerWorks上⾯可以到⼀篇⽂章,对主流的Java XML API进⾏的性能、功能和易⽤性的评测,dom4j⽆论在那个⽅⾯都是⾮常出⾊的。如今你可以看到越来越多的Java软件都在使⽤dom4j来读写XML,特别值得⼀提的是连Sun的JAXM也在⽤dom4j。这是必须使⽤的jar包, Hibernate⽤它来读写配置⽂件。
dom4j主要接⼝都在org.dom4j这个包⾥定义:
Attribute Attribute定义了XML的属性
Branch Branch为能够包含⼦节点的节点如XML元素(Element)和⽂档(Docuemnts)定义了⼀个公共的⾏为,
CDATA CDATA 定义了XML CDATA 区域
CharacterData CharacterData是⼀个标识借⼝,标识基于字符的节点。如CDATA,Comment, Text.
Comment Comment 定义了XML注释的⾏为
Document 定义了XML⽂档
DocumentType DocumentType 定义XML DOCTYPE声明
Element Element定义XML 元素
ElementHandler ElementHandler定义了 Element 对象的处理器
ElementPath 被 ElementHandler 使⽤,⽤于取得当前正在处理的路径层次信息
Entity Entity定义 XML entity
Node Node为所有的dom4j中XML节点定义了多态⾏为
NodeFilter NodeFilter 定义了在dom4j节点中产⽣的⼀个滤镜或谓词的⾏为(predicate)
ProcessingInstruction ProcessingInstruction 定义 XML 处理指令.
Text Text 定义XML ⽂本节点.
Visitor Visitor ⽤于实现Visitor模式.
XPath XPath 在分析⼀个字符串后会提供⼀个XPath 表达式
看名字⼤致就知道它们的涵义如何了。要想弄懂这套接⼝,关键的是要明⽩接⼝的继承关系:
interface java.lang.Cloneable
interface org.dom4j.Node
interface org.dom4j.Attribute
interface org.dom4j.Branch
interface org.dom4j.Document
interface org.dom4j.Element
interface org.dom4j.CharacterData
interface org.dom4j.CDATA
interface org.dom4j.Comment
interface org.dom4j.Text
interface org.dom4j.DocumentType
interface org.dom4j.Entity
interface org.dom4j.ProcessingInstruction
⼀⽬了然,很多事情都清楚了。⼤部分都是由Node继承来的。知道这些关系,将来写程序就不会出现ClassCastException了。
⼆、使⽤dom4j创建xml⽂档
Document document = ateDocument();
通过这句定义⼀个XML⽂档对象。
Element root = document.addElement("根节点名称");
通过这句定义⼀个XML元素,这⾥添加的是根节点。
Element有⼏个重要的⽅法:
addComment :添加注释
addAttribute :添加属性
addElement :添加⼦元素
最后通过XMLWriter⽣成物理⽂件,默认⽣成的XML⽂件排版格式⽐较乱,可以通过OutputFormat类格式化输出,默认采⽤createCompactFormat()显⽰⽐较紧凑,最好使⽤createPrettyPrint()。
实例代码
public static void main(String[] args) {
// 创建⽂档。
Document document = ateDocument();
// 设置⽂档DocType,这⾥为了举例,添加hibernate的DocType
document.addDocType("hibernate-configuration",
"-//Hibernate/Hibernate Configuration DTD 3.0//EN", "hibernate.sourceforge/hibernate-configuration-3.0.dtd");
// ⽂档增加节点,即根节点,⼀个⽂档只能有⼀个根节点,多加出错
Element root = document.addElement("skills");
// 添加注释
root.addComment("第⼀个技能");
// 根节点下添加节点
Element first = root.addElement("skill");
// 节点添加属性
first.addAttribute("name", "独孤九剑");
// 节点下添加节点
Element info = first.addElement("info");
// 节点设置内容数据
info.setText("为独孤求败所创,变化万千,凌厉⽆⽐。其传⼈主要有风清扬、令狐冲。");
// 同理增加其他节点,内容,属性等
Element second = root.addElement("skill");
second.addAttribute("name", "葵花宝典");
Element info2 = second.addElement("info");
info2.setText("宦官所创,博⼤精深,⽽且凶险⾄极。练宝典功夫时,⾸先要⾃宫净⾝。");
// 创建节点
Element third = ateElement_x("skill");
// 将节点加⼊到根节点中
root.add(third);
/
/ 创建属性,第⼀个参数指定了拥有者,也可以为null,指定拥有者
Attribute name = ateAttribute(third, "name", "北冥神功");
// 将属性加⼊到节点上
third.add(name);
// 创建⼦节点并加⼊到节点中
Element info3 = ateElement_x("info");
info3.setText("逍遥派的顶级内功之⼀,能吸⼈内⼒转化为⾃⼰所有,威⼒⽆穷。");
third.add(info3);
try {
// 创建格式化类
OutputFormat format = atePrettyPrint();
/
/ 设置编码格式,默认UTF-8
format.setEncoding("UTF-8");
// 创建输出流,此处要使⽤Writer,需要指定输⼊编码格式,使⽤OutputStream则不⽤
FileOutputStream fos = new FileOutputStream("d:/l");
// 创建xml输出流
XMLWriter writer = new XMLWriter(fos, format);
// ⽣成xml⽂件
writer.write(document);
writer.close();
} catch (Exception e) { e.printStackTrace(); }
}
⽣成XML⽂件内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "hibernate.sourceforge/hibernate-configuration-3.0.dtd">
<skills>
<!--第⼀个技能-->
<skill name="独孤九剑">
<info>为独孤求败所创,变化万千,凌厉⽆⽐。其传⼈主要有风清扬、令狐冲。</info>
</skill>
<skill name="葵花宝典">
<info>宦官所创,博⼤精深,⽽且凶险⾄极。练宝典功夫时,⾸先要⾃宫净⾝。</info>
</skill>
<skill name="北冥神功">
<info>逍遥派的顶级内功之⼀,能吸⼈内⼒转化为⾃⼰所有,威⼒⽆穷。</info>
</skill>
</skills>
三、使⽤dom4j解析xml⽂件
1. 构建dom4j树
org.dom4j.io提供了两个类:SAXReader和DOMReader,DOMReader只能⼀个现有的w3c DOM树构建dom4j树,即只能从⼀个
org.w3c.dom.Document中构建org.dom4j.Document树,⽽SAXReader则使⽤SAX解析器,从不同的输⼊源构建dom4j树,如可以从xml⽂
件中读取并构建dom4j树。
实例代码:使⽤SAXReader解析
SAXReader reader = new SAXReader();
Document document = ad(new File("d:/l"));
实例代码:使⽤DOMReader解析
DocumentBuilderFactory dbf = wInstance();
DocumentBuilder db = wDocumentBuilder();
File file = new File("d:/l");
org.w3c.dom.Document domDocument = db.parse(file);
DOMReader reader = new DOMReader();
org.dom4j.Document document = ad(domDocument);
2. 获取节点
获得dom4j树之后,可以根据dom4j树获取节点。⾸先获取根节点,然后根据根节点获取其⼦节点。实例代码:访问根节点
Element root = RootElement();
实例代码:访问所有⼦节点
List skills = root.elements();
for (Iterator<?> it = skills.iterator(); it.hasNext();) {
Element e = (Element) it.next();
//TODO
}
实例代码:访问指定名称的节点,如访问名称为“skill”的全部节点
List skills = root.elements("skill");
for (Iterator<?> it = skills.iterator(); it.hasNext();) {
Element e = (Element) it.next();
/
/TODO
}
实例代码:访问指定名称的第⼀个节点
Element skill = root.element("skill");
实例代码:迭代某个元素的所有⼦元素,如迭代root
for(Iterator<Element> it = root.elementIterator();it.hasNext();){
Element e = it.next();
//TODO
}
3. 获取属性
获取节点后,可以根据节点获取属性,获得⽅式与获取节点类似。
使用dom4j解析xml文件
实例代码:获取指定名称的元素
Element skill = root.element("skill");
Attribute attr1 = skill.attribute("name");
实例代码:按照属性顺序获取属性,
Element skill = root.element("skill");
Attribute attr2 = skill.attribute(0);
实例代码:获取某节点下全部属性1
Element skill = root.element("skill");
List<Attribute> list = skill.attributes();
for (Iterator<Attribute> it = list.iterator(); it.hasNext();) {
Attribute attr = it.next();
/
/ TODO
}
实例代码:获取某节点下全部属性2
Element skill = root.element("skill");
for (Iterator<Attribute> it = skill.attributeIterator(); it.hasNext();) {
Attribute attr = it.next();
// TODO
}
4. 使⽤XPath获取节点和属性
Dom4j 中集成了对XPath的⽀持。在选择节点时,可以直接使⽤XPath 表达式。这种⽅式更加⽅便,简洁,官⽅⽂档中推荐使⽤该种⽅式。实例代码:要选择所有的<skill>元素的name属性
List list = document.selectNodes("//skills/skill/@name");
for (Iterator it = list.iterator(); it.hasNext();) {
Attribute attr = (Attribute) it.next();
//TODO
}
四、使⽤dom4j修改xml⽂件
修改xml⽂件,需要先获取dom4j树(即Document),通常欲修改节点需要先获得该节点或其⽗节点,欲修改属性,需要先获得该属性所在的节点和该属性。
增加操作:参照前⽂。
删除操作:
实例代码:删除某节点
Element root = RootElement();

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。