dom4j从基础到精通Word文档格式.docx
- 文档编号:17608619
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:17
- 大小:22.66KB
dom4j从基础到精通Word文档格式.docx
《dom4j从基础到精通Word文档格式.docx》由会员分享,可在线阅读,更多相关《dom4j从基础到精通Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
CharacterData是一个标识借口,标识基于字符的节点。
如CDATA,Comment,Text.
Comment
Comment定义了XML注释的行为
Document
定义了XML文档
DocumentType
DocumentType定义XMLDOCTYPE声明
Element
Element定义XML元素
ElementHandler
ElementHandler定义了Element对象的处理器
ElementPath
被ElementHandler使用,用于取得当前正在处理的路径层次信息
Entity
Entity定义XMLentity
Node
Node为所有的dom4j中XML节点定义了多态行为
NodeFilter
NodeFilter定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)
ProcessingInstruction
ProcessingInstruction定义XML处理指令.
Text
Text定义XML文本节点.
Visitor
Visitor用于实现Visitor模式.
XPath
XPath在分析一个字符串后会提供一个XPath表达式
看名字大致就知道它们的涵义如何了。
要想弄懂这套接口,关键的是要明白接口的继承关系:
ointerfacejava.lang.Cloneable
ointerfaceorg.dom4j.Node
▪interfaceorg.dom4j.Attribute
▪interfaceorg.dom4j.Branch
▪interfaceorg.dom4j.Document
▪interfaceorg.dom4j.Element
▪interfaceorg.dom4j.CharacterData
▪interfaceorg.dom4j.CDATA
▪interfaceorg.dom4j.Comment
▪interfaceorg.dom4j.Text
▪interfaceorg.dom4j.DocumentType
▪interfaceorg.dom4j.Entity
▪interfaceorg.dom4j.ProcessingInstruction
一目了然,很多事情都清楚了。
大部分都是由Node继承来的。
知道这些关系,将来写程序就不会出现ClassCastException了。
二、使用dom4j创建xml文档
Documentdocument=DocumentHelper.createDocument();
通过这句定义一个XML文档对象。
Elementroot=document.addElement("
根节点名称"
);
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
addComment:
添加注释
addAttribute:
添加属性
addElement:
添加子元素
最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类格式化输出,默认采用createCompactFormat()显示比较紧凑,最好使用createPrettyPrint()。
实例代码
publicstaticvoidmain(String[]args){
//创建文档。
Documentdocument=DocumentHelper.createDocument();
//设置文档DocType,这里为了举例,添加hibernate的DocType
document.addDocType("
hibernate-configuration"
"
-//Hibernate/HibernateConfigurationDTD3.0//EN"
"
//文档增加节点,即根节点,一个文档只能有一个根节点,多加出错
Elementroot=document.addElement("
skills"
//添加注释
root.addComment("
第一个技能"
//根节点下添加节点
Elementfirst=root.addElement("
skill"
//节点添加属性
first.addAttribute("
name"
"
独孤九剑"
//节点下添加节点
Elementinfo=first.addElement("
info"
//节点设置内容数据
info.setText("
为独孤求败所创,变化万千,凌厉无比。
其传人主要有风清扬、令狐冲。
"
//同理增加其他节点,内容,属性等
Elementsecond=root.addElement("
second.addAttribute("
葵花宝典"
Elementinfo2=second.addElement("
info2.setText("
宦官所创,博大精深,而且凶险至极。
练宝典功夫时,首先要自宫净身。
/**
*第二种方法增加节点,内容,属性等。
先创建节点,属性,然后使用add加入。
*/
//创建节点
Elementthird=DocumentHelper.createElement("
//将节点加入到根节点中
root.add(third);
//创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者
Attributename=DocumentHelper.createAttribute(third,"
北冥神功"
//将属性加入到节点上
third.add(name);
//创建子节点并加入到节点中
Elementinfo3=DocumentHelper.createElement("
info3.setText("
逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。
third.add(info3);
try{
//创建格式化类
OutputFormatformat=OutputFormat.createPrettyPrint();
//设置编码格式,默认UTF-8
format.setEncoding("
UTF-8"
//创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用
FileOutputStreamfos=newFileOutputStream("
d:
/skills.xml"
//创建xml输出流
XMLWriterwriter=newXMLWriter(fos,format);
//生成xml文件
writer.write(document);
writer.close();
}catch(Exceptione){
e.printStackTrace();
}
}
生成XML文件内容
<
?
xmlversion="
1.0"
encoding="
>
!
DOCTYPEhibernate-configurationPUBLIC"
"
skills>
<
--第一个技能-->
skillname="
info>
/info>
/skill>
/skills>
三、使用dom4j解析xml文件
1.构建dom4j树
org.dom4j.io提供了两个类:
SAXReader和DOMReader,DOMReader只能一个现有的w3cDOM树构建dom4j树,即只能从一个org.w3c.dom.Document中构建org.dom4j.Document树,而SAXReader则使用SAX解析器,从不同的输入源构建dom4j树,如可以从xml文件中读取并构建dom4j树。
实例代码:
使用SAXReader解析
SAXReaderreader=newSAXReader();
Documentdocument=reader.read(newFile("
));
使用DOMReader解析
DocumentBuilderFactorydbf=DocumentBuilderFactory.newInstance();
DocumentBuilderdb=dbf.newDocumentBuilder();
Filefile=newFile("
org.w3c.dom.DocumentdomDocument=db.parse(file);
DOMReaderreader=newDOMReader();
org.dom4j.Documentdocument=reader.read(domDocument);
2.获取节点
获得dom4j树之后,可以根据dom4j树获取节点。
首先获取根节点,然后根据根节点获取其子节点。
访问根节点
Elementroot=document.getRootElement();
访问所有子节点
Listskills=root.elements();
for(Iterator<
it=skills.iterator();
it.hasNext();
){
Elemente=(Element)it.next();
//TODO
访问指定名称的节点,如访问名称为“skill”的全部节点
Listskills=root.elements("
访问指定名称的第一个节点
Elementskill=root.element("
迭代某个元素的所有子元素,如迭代root
for(Iterator<
Element>
it=root.elementIterator();
it.hasNext();
){
Elemente=it.next();
3.获取属性
获取节点后,可以根据节点获取属性,获得方式与获取节点类似。
获取指定名称的元素
Attributeattr1=skill.attribute("
按照属性顺序获取属性,
Attributeattr2=skill.attribute(0);
获取某节点下全部属性1
List<
Attribute>
list=skill.attributes();
it=list.iterator();
Attributeattr=it.next();
//TODO
获取某节点下全部属性2
it=skill.attributeIterator();
4.使用XPath获取节点和属性
Dom4j中集成了对XPath的支持。
在选择节点时,可以直接使用XPath表达式。
这种方式更加方便,简洁,官方文档中推荐使用该种方式。
要选择所有的<
skill>
元素的name属性
Listlist=document.selectNodes("
//skills/skill/@name"
for(Iteratorit=list.iterator();
Attributeattr=(Attribute)it.next();
注意:
为了能够编译执行上述使用XPath表达式的代码,需要配置dom4j安装包中自带的jaxen包,你也可以从目录下,有一个lib子目录,其中有个jaxen-1.1-beta-6.jar文件,需要在classpath环境变量中配置该文件的全路径名。
四、使用dom4j修改xml文件
修改xml文件,需要先获取dom4j树(即Document),通常欲修改节点需要先获得该节点或其父节点,欲修改属性,需要先获得该属性所在的节点和该属性。
增加操作:
参照前文。
删除操作:
删除某节点
root.remove(skill);
删除指定名称的属性
skill.remove(skill.attribute("
修改操作:
修改节点名称和节点值
skill.setName("
new_skill"
skill.setText("
你好"
修改属性值
Attributeattr=skill.attribute("
attr.setText("
newName"
属性名称无法修改,欲修改属性名称,可以先删除旧属性,再增加新属性
五、常用方法
1.Element元素API
Method
getQName()
元素的QName对象
getNamespace()
元素所属的Namespace对象
getNamespacePrefix()
元素所属的Namespace对象的prefix
getNamespaceURI()
元素所属的Namespace对象的URI
getName()
元素的localname
getQualifiedName()
元素的qualifiedname
getText()
元素所含有的text内容,如果内容为空则返回一个空字符串而不是null
getTextTrim()
元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null
attributeIterator()
元素属性的iterator,其中每个元素都是Attribute对象
attributeValue()
元素的某个指定属性所含的值
elementIterator()
元素的子元素的iterator,其中每个元素都是Element对象
element()
元素的某个指定(qualifiedname或者localname)的子元素
elementText()
元素的某个指定(qualifiedname或者localname)的子元素中的text信息
getParent
元素的父元素
getPath()
元素的XPath表达式,其中父元素的qualifiedname和子元素的qualifiedname之间使用"
/"
分隔
isTextOnly()
是否该元素只含有text或是空元素
isRootElement()
是否该元素是XML树的根节点
2.Attribute属性API
属性的QName对象
属性所属的Namespace对象
属性所属的Namespace对象的prefix
属性所属的Namespace对象的URI
属性的localname
属性的qualifiedname
getValue()
属性的值
2.字符串转化
把节点,属性,文档等转化成字符串,使用asXML()方法。
StringdocXmlText=document.asXML();
StringrootXmlText=root.asXML();
把字符串转换为文档,注意引号需要转义
StringskillString="
skillname=\"
xxx\"
神龙摆尾<
;
Documentd=DocumentHelper.parseText(skillString);
3.命名空间(Namespace)操作
dom4j的名称空间信息api常用的方法有8个。
dom4j在Element和Attribute接口中定义了获取名称空间信息的方法,这些方法和JDOM中的方法相同。
如下所示:
publicjava.lang.StringgetNamespacePrefix()该方法返回元素(属性)的名称空间前缀
publicjava.lang.StringgetNamespaceURI()该方法返回元素(属性)的名称空间
URIpublicjava.lang.StringgetName()该方法返回元素(属性)的本地名
publicjava.lang.StringgetQualifiedName()该方法返回元素(属性)的限定名
publicNamespacegetNamespace()该方法返回元素本身的名称空间
publicjava.util.ListadditionalNamespaces()返回某元素上附加的名称空间声明列表,列表中的每一个对象都是Namespace类型。
这个类的方法提供了两个方法分别获得名称空间前缀和本地名。
如下:
publicjava.lang.StringgetPrefix()该方法返回名称空间前缀。
publicjava.lang.StringgetURI()该方法返回名称空间的URI。
六、Qname介绍
Qname在使用dom4j的时候,经常见到,一般自己解析的xml很少使用这种复杂格式。
1.来历:
qname是qualifiedname的简写
2.构成:
由名字空间(namespace)前缀(prefix)以及冒号(:
),还有一个元素名称构成
3.举例:
xsl:
stylesheetxmlns:
xsl="
http:
//www.w3.org/1999/XSL/Transform"
xmlns="
//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
version="
<
templatematch="
foo"
hr/>
/xsl:
template>
stylesheet>
xsl是名字空间前缀,template
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- dom4j 基础 精通