dom4j怎样新增和QName类型的dom4j修改节点属性值

说三道四技术文摘-感悟人生的经典句子
> 文档快照
现在通过dom4j解析并修改xml文件,现在想要新增和删除元素QName类型的属性,但老是出错,各位大神,帮忙瞅瞅。
比如原始XML文件如下
&rootElement&name="root&Elemant"/&
现在想要改为如下:
&rootElement&name="root&Elemant"&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&xsi:noNamespaceSchemaLocation="http:///xxxx"/&,请问该如何操作。
我是通过如下方法新增的:
File&inputXml=new&File("example.xml"));
SAXReader&saxReader=new&SAXReader();
Document&document=saxReader.read(inputXml);
Element&fmElement=document.getRootElement();
Namespace&ns=Namespace.get("xsi",&"http://www.w3.org/2001/XMLSchema-instance");
fmElement.addNamespace("xsi",&"http://www.w3.org/2001/XMLSchema-instance");
QName&qURI=new&QName("noNamespaceSchemaLocation",ns);
fmElement.addAttribute(qURI,"http:///xxxx");
这样可以新增成功,也能达到我的要求,但接下来删除xmlns:xsi以及xsi:noNamespaceSchemaLocation,回到原始状态:
&rootElement&name="root&Elemant"/&
但出问题了,关键我是没法xsi:noNamespaceSchemaLocation元素,我的代码如下:
File&inputXml=new&File("example.xml");
SAXReader&saxReader=new&SAXReader();
Document&document=saxReader.read(inputXml);
Element&root&=&document.getRootElement();
Namespace&xmln&=&root.getNamespaceForPrefix("xsi");
QName&qURI=QName.get("noNamespaceSchemaLocation");//qURI不空
Attribute&aURI=root.attribute(qURI);//但此处获得的aURI属性为空,难道不知这样获取QName类型的属性吗?
&&&&&&&&&&&&&&&&root.remove(aURI);//因为aURI为空,此处自然会报NullpointException异常
root.remove(xmln);
我新增或删除QName类型属性的方法不对吗?求指导~
Element&fmElement&=&document.getRootElement();
Namespace&xmln&=&fmElement.getNamespaceForPrefix("xsi");
fmElement.remove(fmElement.attribute("noNamespaceSchemaLocation"));
fmElement.remove(xmln);这样是可以删除的
备案号: 说三道四1、DOM4J简介
&&&&DOM4J是&dom4j.org&出品的一个开源&XML&解析包。DOM4J应用于&Java&平台,采用了&Java&集合框架并完全支持&DOM,SAX&和&JAXP。
&&&&DOM4J&使用起来非常简单。只要你了解基本的&XML-DOM&模型,就能使用。
&&&&Dom:把整个文档作为一个对象。
&&DOM4J&最大的特色是使用大量的接口。它的主要接口都在org.dom4j里面定义:
定义了&XML&的属性。
指能够包含子节点的节点。如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为
定义了&XML&CDATA&区域
CharacterData
是一个标识接口,标识基于字符的节点。如CDATA,Comment,&Text.
定义了&XML&注释的行为
定义了XML&文档
DocumentType
定义&XML&DOCTYPE&声明
定义XML&元素
ElementHandler
定义了Element&对象的处理器
ElementPath
被&ElementHandler&使用,用于取得当前正在处理的路径层次信息
定义&XML&entity
为dom4j中所有的XML节点定义了多态行为
NodeFilter
定义了在dom4j&节点中产生的一个滤镜或谓词的行为(predicate)
ProcessingInstruction
定义&XML&处理指令
定义&XML&文本节点
用于实现&Visitor模式
在分析一个字符串后会提供一个&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&ment
&&&&&&&&&&&&&&&&&&interface&org.dom4j.Text
&&&&&&&&&&&interface&org.dom4j.DocumentType
&&&&&&&&&&&interface&org.dom4j.Entity
&&&&&&&&&&&interface&org.dom4j.ProcessingInstruction
2、XML文档操作1
2.1、读取XML文档:
&&&&&读写XML文档主要依赖于org.dom4j.io包,有DOMReader和SAXReader两种方式。因为利用了相同的接口,它们的调用方式是一样的。
public&static&Document&load(String&filename)&{
Document&document&=&
SAXReader&saxReader&=&new&SAXReader();
document&=&saxReader.read(new&File(filename));&&//读取XML文件,获得document对象
}&catch&(Exception&ex)&{
ex.printStackTrace();
public&static&Document&load(URL&url)&{
Document&document&=&
SAXReader&saxReader&=&new&SAXReader();
document&=&saxReader.read(url);&&//读取XML文件,获得document对象
}&catch&(Exception&ex)&{
ex.printStackTrace();
//读取指定的xml文件之后返回一个Document对象,这个对象代表了整个XML文档,用于各种Dom运算。执照XML文件头所定义的编码来转换。
2.2、获取根节点
根节点是xml分析的开始,任何xml分析工作都需要从根开始
Xml&xml&=&new&Xml();
Document&dom&=&xml.load(path&+&&/&&+&file);
Element&root&=&dom.getRootElement();
2.3、.&新增一个节点以及其下的子节点与数据
Element&menuElement&=&root.addElement(&menu&);
Element&engNameElement&=&menuElement.addElement(&engName&);
engNameElement.setText(catNameEn);
Element&chiNameElement&=&menuElement.addElement(&chiName&);
chiNameElement.setText(catName);
2.4、&写入XML文件
注意文件操作的包装类是乱码的根源
public&static&boolean&doc2XmlFile(Document&document,&String&filename)&{
boolean&flag&=&
XMLWriter&writer&=&new&XMLWriter(&new&OutputStreamWriter(new&FileOutputStream(filename),&UTF-8&));
writer.write(document);
writer.close();
}&catch&(Exception&ex)&{
ex.printStackTrace();
System.out.println(flag);
&&&&Dom4j通过XMLWriter将Document对象表示的XML树写入指定的文件,并使用OutputFormat格式对象指定写入的风格和编码方法。调用OutputFormat.createPrettyPrint()方法可以获得一个默认的pretty&print风格的格式对象。对OutputFormat对象调用setEncoding()方法可以指定XML文件的编码方法。
public&void&writeTo(OutputStream&out,&String&encoding)&throws&UnsupportedEncodingException,&IOException&{
&&&&&&&OutputFormat&format&=&OutputFormat.createPrettyPrint();
&&&&&&&format.setEncoding(&gb2312&);
&&&&&&&XMLWriter&writer&=&new&XMLWriter(System.out,format);
&&&&&&&writer.write(doc);
&&&&&&&writer.flush();
2.&5、遍历xml节点
&&&&&&&对Document对象调用getRootElement()方法可以返回代表根节点的Element对象。拥有了一个Element对象后,可以对该对象调用elementIterator()方法获得它的子节点的Element对象们的一个迭代器。使用(Element)iterator.next()方法遍历一个iterator并把每个取出的元素转化为Element类型。
public&boolean&isOnly(String&catNameEn,HttpServletRequest&request,String&xml)&{
boolean&flag&=&
String&path&=&request.getRealPath(&&);
Document&doc&=&load(path+&/&+xml);
Element&root&=&doc.getRootElement();
for&(Iterator&i&=&root.elementIterator();&i.hasNext();)&{
Element&el&=&(Element)&i.next();
if(catNameEn.equals(el.elementTextTrim(&engName&))){
2.6、创建xml文件
public&static&void&main(String&args[]){
String&fileName=&c:/text.xml&;
Document&document=DocumentHelper.createDocument();//建立document对象,用来操作xml文件
Element&booksElement=document.addElement(&books&);//建立根节点
booksElement.addComment(&This&is&a&test&for&dom4j&&);//加入一行注释
Element&bookElement=booksElement.addElement(&book&);//添加一个book节点
bookElement.addAttribute(&show&,&yes&);//添加属性内容
Element&titleElement=bookElement.addElement(&title&);//添加文本节点
titleElement.setText(&ajax&in&action&);//添加文本内容
XMLWriter&writer=new&XMLWriter(new&FileWriter(new&File(fileName)));
writer.close();writer.write(document);
}catch(Exception&e){
e.printStackTrace();
2.7、修改节点属性
public&static&void&modifyXMLFile()&{
String&oldStr&=&&c:/text.xml&;
String&newStr&=&&c:/text1.xml&;
Document&document&=&null;
//修改节点的属性
SAXReader&saxReader&=&new&SAXReader();&//&用来读取xml文档
document&=&saxReader.read(new&File(oldStr));&//&读取xml文档
List&list&=&document.selectNodes(&/books/book/@show&);//&用xpath查找节点book的属性
Iterator&iter&=&list.iterator();
while&(iter.hasNext())&{
Attribute&attribute&=&(Attribute)&iter.next();
if&(attribute.getValue().equals(&yes&))&
&&&&attribute.setValue(&no&);
}&catch&(Exception&e)&{
&&&&e.printStackTrace();
//修改节点的内容
SAXReader&saxReader&=&new&SAXReader();&//&用来读取xml文档
document&=&saxReader.read(new&File(oldStr));&//&读取xml文档
List&list&=&document.selectNodes(&/books/book/title&);//&用xpath查找节点book的内容
Iterator&iter&=&list.iterator();
while&(iter.hasNext())&{
Element&element&=&(Element)&iter.next();
element.setText(&xxx&);//&设置相应的内容
}&catch&(Exception&e)&{
&&&&e.printStackTrace();
XMLWriter&writer&=&new&XMLWriter(new&FileWriter(new&File(newStr)));
writer.write(document);
writer.close();
}&catch&(Exception&ex)&{
&&&&ex.printStackTrace();
2.8、删除节点
public&static&void&removeNode()&{
String&oldStr&=&&c:/text.xml&;
String&newStr&=&&c:/text1.xml&;
Document&document&=&null;
SAXReader&saxReader&=&new&SAXReader();//&用来读取xml文档
document&=&saxReader.read(new&File(oldStr));//&读取xml文档
List&list&=&document.selectNodes(&/books/book&);//&用xpath查找对象
Iterator&iter&=&list.iterator();
while&(iter.hasNext())&{
Element&bookElement&=&(Element)&iter.next();
//&创建迭代器,用来查找要删除的节点,迭代器相当于指针,指向book下所有的title节点
Iterator&iterator&=&bookElement.elementIterator(&title&);
while&(iterator.hasNext())&{
Element&titleElement&=&(Element)&iterator.next();
if&(titleElement.getText().equals(&ajax&in&action&))&{
bookElement.remove(titleElement);
}&catch&(Exception&e)&{
e.printStackTrace();
XMLWriter&writer&=&new&XMLWriter(new&FileWriter(new&File(newStr)));
writer.write(document);
writer.close();
}&catch&(Exception&ex)&{
ex.printStackTrace();
2、XML文档操作2
2.1、Document对象相关&&&&&&&&
1、读取XML文件,获得document对象.&&&&&&
&&&&&&&SAXReader&reader&=&new&SAXReader();&&
&&&&&&Document&&&document&=&reader.read(new&File(&input.xml&));&&&&&&
2、解析XML形式的文本,得到document对象.&&&&&&
&&&&&&&&&&&&&String&text&=&&&members&&/members&&;&&&&&&
&&&&&&&&&&&&&Document&document&=&DocumentHelper.parseText(text);&&&&&&
3、主动创建document对象.&&&&&&
&&&&&&&&&&&&&Document&document&=&DocumentHelper.createDocument();&&&&&&
&&&&&&&&&&&&&Element&root&=&document.addElement(&members&);//&创建根节点&&&&&&
2.2、节点相关&&&&&&&&
1、获取文档的根节点.&&&&&&
Element&rootElm&=&document.getRootElement();&&&&&&
2、取得某节点的单个子节点.&&&&&&
Element&memberElm=root.element(&member&);//&&member&是节点名&&&&&&
3.取得节点的文字&&&&&&
String&text=memberElm.getText();&&&&&
String&text=root.elementText(&name&);这个是取得根节点下的name字节点的文字.&&&&&&&
4.取得某节点下指定名称的所有节点并进行遍历.&&&&&&
List&nodes&=&rootElm.elements(&member&);&&&&&&
for&(Iterator&it&=&nodes.iterator();&it.hasNext();)&{&&&&&&
&&&&Element&elm&=&(Element)&it.next();&&&&&&
&&&//&do&something&&&&&&
5.对某节点下的所有子节点进行遍历.&&&&&&
&&&&&&&&&&&&for(Iterator&it=root.elementIterator();it.hasNext();){&&&&&&
&&&&&&&&&&&&&&&&&Element&element&=&(Element)&it.next();&&&&&&
&&&&&&&&&&&&&&&&//&do&something&&&&&&
&&&&&&&&&&&&&}&&&&&&
6.在某节点下添加子节点.&&&&&&
Element&ageElm&=&newMemberElm.addElement(&age&);&&&&&&
7.设置节点文字.&&&&&&
ageElm.setText(&29&);&&&&&&
8.删除某节点.&&&&&&
parentElm.remove(childElm);&&&&//&childElm是待删除的节点,parentElm是其父节点&&&&&&
9.添加一个CDATA节点.&&&&&&
&&&&&&&&&Element&contentElm&=&infoElm.addElement(&content&);&&&&&&
&&&&&&&&&contentElm.addCDATA(diary.getContent());&&&&&&
2.3、属性相关.&&&&&&
1.取得节点的指定的属性&&&&&&
&&&&&&&&&&&&&Element&root=document.getRootElement();&&&&&&&&&&
&&&&&&&&&&&&&Attribute&attribute=root.attribute(&size&);&&&&//&属性名name&&&&&&
2.取得属性的文字&&&&&&
&&&&String&text=attribute.getText();&&&&
String&text2=root.element(&name&).attributeValue(&firstname&);
//这个是取得根节点下name字节点的firstname属性的值.&&&&&&
3.遍历某节点的所有属性&&&&&&
Element&root=document.getRootElement();
for(Iterator&it=root.attributeIterator();it.hasNext();){
Attribute&attribute&=&(Attribute)&it.next();
String&text=attribute.getText();
System.out.println(text);
4.设置某节点的属性和文字.&&&&&&
newMemberElm.addAttribute(&name&,&&sitinspring&);&&&&
5.设置属性的文字&&&&&&
&&&&&&&&&&&&&Attribute&attribute=root.attribute(&name&);&&&&&&
&&&&&&&&&&&&&attribute.setText(&sitinspring&);&&&&&&
6.删除某属性&&&&&&
&&&&&&&&&&&&&Attribute&attribute=root.attribute(&size&);//&属性名name&&&&&&
&&&&&&&&&&&&&root.remove(attribute);&&&&&&
2.4、将文档写入XML文件.&&&&&&
1.文档中全为英文,不设置编码,直接写入.&&&&&&
XMLWriter&writer&=&new&XMLWriter(new&FileWriter(&output.xml&));&&&&&&
writer.write(document);&&&&&&
writer.close();&&&&&&
2.文档中含有中文,设置编码格式再写入.&&&&&&
OutputFormat&format&=&OutputFormat.createPrettyPrint();
format.setEncoding(&GBK&);&&&&//&指定XML编码
XMLWriter&writer&=&new&XMLWriter(new&FileWriter(&output.xml&),format);
writer.write(document);
writer.close();
2.5、字符串与XML的转换&&&&&&
1.将字符串转化为XML&&&&&&
String&text&=&&&members&&&member&sitinspring&/member&&&/members&&;&&&&&&
Document&document&=&DocumentHelper.parseText(text);&&&&&&
2.将文档或节点的XML转化为字符串.&&&&&&
SAXReader&reader&=&new&SAXReader();
Document&document&=&reader.read(new&File(&input.xml&));
Element&root=document.getRootElement();
String&docXmlText=document.asXML();
String&rootXmlText=root.asXML();
Element&memberElm=root.element(&member&);
String&memberXmlText=memberElm.asXML();
3、dom4j的事件处理模型涉及的类和接口:
3.1、类:SAXReader
&&&&&&&&&public&void&addHandler(String&path,ElementHandler&handler)
&&&&&当解析到path指定的路径时,将调用参数handler指定的处理器。针对不同的节点可以添加多个handler实例。或者调用默认的Handler&setDefaultHandler(ElementHandler&handler);
3.2、接口ElementHandler
&&&&&&&&&public&void&onStart(ElementPath&path)
&&&&&该方法在解析到元素的开始标签时被调用。
&&&&&&&&&public&void&onEnd(ElementPath&path)
&&&&&该方法在解析到元素的结束标签时被调用
3.3、接口:ElementPath&(假设有参数:ElementPath&path)
&&&&&&&&&public&void&addHandler(String&path,ElementHandler)
&&&&&该方法与SAXReader类中的addHandler()方法的作用相同。路径path可以是绝对路径(路径以/开头),也可以是相对路径(假设是当前路径的子节点路径)。
&&&&&&&&&public&void&removeHandler(String&path)
&&&&&移除指定路径上的ElementHandler实例。路径可以是相对路径,也可以是绝对路径。
&&&&&&&&&public&String&getPath()
&&&&&该方法得到当前节点的路径。该方法返回的是完整的绝对路径
&&&&&&&&&public&Element&getCurrent()
&&&&&该方法得到当前节点。
3.3、Element类&
getQName()
元素的QName对象
getNamespace()
元素所属的Namespace对象
getNamespacePrefix()
元素所属的Namespace对象的prefix
getNamespaceURI()
元素所属的Namespace对象的URI
元素的local&name
getQualifiedName()
元素的qualified&name
元素所含有的text内容,如果内容为空则返回一个空字符串而不是null
getTextTrim()
元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回null
attributeIterator()
元素属性的iterator,其中每个元素都是Attribute对象
attributeValue()
元素的某个指定属性所含的值
elementIterator()
元素的子元素的iterator,其中每个元素都是Element对象
元素的某个指定(qualified&name或者local&name)的子元素
elementText()
元素的某个指定(qualified&name或者local&name)的子元素中的text信息
元素的父元素
元素的XPath表达式,其中父元素的qualified&name和子元素的qualified&name之间使用&/&分隔
isTextOnly()
是否该元素只含有text或是空元素
isRootElement()
是否该元素是XML树的根节点
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:97073次
积分:2163
积分:2163
排名:第13977名
原创:16篇
转载:647篇
(1)(1)(7)(5)(18)(6)(48)(170)(108)(72)(34)(55)(26)(3)(82)(24)(7)其他(35)
J2EE(125)
J2SE(57)
原文转自:/article/recommend/132.html一、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 entityNode Node为所有的dom4j中XML节点定义了多态行为NodeFilter NodeFilter 定义了在dom4j节点中产生的一个滤镜或谓词的行为(predicate)ProcessingInstruction ProcessingInstruction 定义 XML 处理指令.Text Text 定义XML 文本节点.Visitor Visitor 用于实现Visitor模式.XPath XPath 在分析一个字符串后会提供一个XPath 表达式看名字大致就知道它们的涵义如何了。要想弄懂这套接口,关键的是要明白接口的继承关系:interface java.lang.Cloneableinterface org.dom4j.Nodeinterface org.dom4j.Attributeinterface org.dom4j.Branchinterface org.dom4j.Documentinterface org.dom4j.Elementinterface org.dom4j.CharacterDatainterface org.dom4j.CDATAinterface mentinterface org.dom4j.Textinterface org.dom4j.DocumentTypeinterface org.dom4j.Entityinterface org.dom4j.ProcessingInstruction一目了然,很多事情都清楚了。大部分都是由Node继承来的。知道这些关系,将来写程序就不会出现ClassCastException了。二、使用dom4j创建xml文档Document document = DocumentHelper.createDocument();通过这句定义一个XML文档对象。Element root = document.addElement(&根节点名称&);通过这句定义一个XML元素,这里添加的是根节点。Element有几个重要的方法:addComment : 添加注释addAttribute : 添加属性addElement : 添加子元素最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类格式化输出,默认采用createCompactFormat()显示比较紧凑,最好使用createPrettyPrint()。实例代码public static void main(String[] args) {// 创建文档。Document document = DocumentHelper.createDocument();// 设置文档DocType,这里为了举例,添加hibernate的DocTypedocument.addDocType(&hibernate-configuration&,&-//Hibernate/Hibernate Configuration DTD 3.0//EN&, &http://hibernate.sourceforge.net/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 = DocumentHelper.createElement_x(&skill&);// 将节点加入到根节点中root.add(third);// 创建属性,第一个参数指定了拥有者,也可以为null,指定拥有者Attribute name = DocumentHelper.createAttribute(third, &name&, &北冥神功&);// 将属性加入到节点上third.add(name);// 创建子节点并加入到节点中Element info3 = DocumentHelper.createElement_x(&info&);info3.setText(&逍遥派的顶级内功之一,能吸人内力转化为自己所有,威力无穷。&);third.add(info3);try {// 创建格式化类OutputFormat format = OutputFormat.createPrettyPrint();// 设置编码格式,默认UTF-8format.setEncoding(&UTF-8&);// 创建输出流,此处要使用Writer,需要指定输入编码格式,使用OutputStream则不用FileOutputStream fos = new FileOutputStream(&d:/skills.xml&);// 创建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& &http://hibernate.sourceforge.net/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 = reader.read(new File(&d:/skills.xml&));实例代码:使用DOMReader解析DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();File file = new File(&d:/skills.xml&);org.w3c.dom.Document domDocument = db.parse(file);DOMReader reader = new DOMReader();org.dom4j.Document document = reader.read(domDocument);2. 获取节点获得dom4j树之后,可以根据dom4j树获取节点。首先获取根节点,然后根据根节点获取其子节点。实例代码:访问根节点Element root = document.getRootElement();实例代码:访问所有子节点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&);实例代码:迭代某个元素的所有子元素,如迭代rootfor(Iterator&Element& it = root.elementIterator();it.hasNext();){Element e = it.next();//TODO}3. 获取属性获取节点后,可以根据节点获取属性,获得方式与获取节点类似。实例代码:获取指定名称的元素Element skill = root.element(&skill&);Attribute attr1 = skill.attribute(&name&);实例代码:按照属性顺序获取属性,Element skill = root.element(&skill&);Attribute attr2 = skill.attribute(0);实例代码:获取某节点下全部属性1Element skill = root.element(&skill&);List&Attribute& list = skill.attributes();for (Iterator&Attribute& it = list.iterator(); it.hasNext();) {Attribute attr = it.next();// TODO}实例代码:获取某节点下全部属性2Element 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}注意:为了能够编译执行上述使用XPath表达式的代码,需要配置dom4j 安装包中自带的jaxen包,你也可以从http://sourceforge.net/products/jaxen/上下载jaxen。jaxen是一个用java开发的XPath引擎,用于配合各种基于XML的对象模型,如DOM,dom4j和JDOM。在dom4-1.6.1 目录下,有一个lib 子目录,其中有个jaxen-1.1-beta-6.jar文件,需要在classpath环境变量中配置该文件的全路径名。四、使用dom4j修改xml文件修改xml文件,需要先获取dom4j树(即Document),通常欲修改节点需要先获得该节点或其父节点,欲修改属性,需要先获得该属性所在的节点和该属性。增加操作:参照前文。删除操作:实例代码:删除某节点Element root = document.getRootElement();Element skill = root.element(&skill&);root.remove(skill);实例代码:删除指定名称的属性Element skill = root.element(&skill&);skill.remove(skill.attribute(&name&));修改操作:实例代码:修改节点名称和节点值Element skill = root.element(&skill&);skill.setName(&new_skill&);skill.setText(&你好&);实例代码:修改属性值Attribute attr = skill.attribute(&name&);attr.setText(&newName&);属性名称无法修改,欲修改属性名称,可以先删除旧属性,再增加新属性五、常用方法1.Element元素APIMethod CommentgetQName() 元素的QName对象getNamespace() 元素所属的Namespace对象getNamespacePrefix() 元素所属的Namespace对象的prefixgetNamespaceURI() 元素所属的Namespace对象的URIgetName() 元素的local namegetQualifiedName() 元素的qualified namegetText() 元素所含有的text内容,如果内容为空则返回一个空字符串而不是nullgetTextTrim() 元素所含有的text内容,其中连续的空格被转化为单个空格,该方法不会返回nullattributeIterator() 元素属性的iterator,其中每个元素都是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. Attribute属性APIMethod CommentgetQName() 属性的QName对象getNamespace() 属性所属的Namespace对象getNamespacePrefix() 属性所属的Namespace对象的prefixgetNamespaceURI() 属性所属的Namespace对象的URIgetName() 属性的local namegetQualifiedName() 属性的qualified namegetValue() 属性的值2. 字符串转化实例代码:把节点,属性,文档等转化成字符串,使用asXML()方法。String docXmlText = document.asXML();String rootXmlText = root.asXML();实例代码:把字符串转换为文档,注意引号需要转义String skillString = &&skill name=&xxx&&神龙摆尾&/skill&&;Document d = DocumentHelper.parseText(skillString);3. 命名空间(Namespace)操作dom4j的名称空间信息api常用的方法有8个。dom4j在Element和Attribute 接口中定义了获取名称空间信息的方法,这些方法和JDOM中的方法相同。如下所示:public java.lang.String getNamespacePrefix()该方法返回元素(属性)的名称空间前缀public java.lang.String getNamespaceURI()该方法返回元素(属性)的名称空间URIpublic java.lang.String getName()该方法返回元素(属性)的本地名public java.lang.String getQualifiedName()该方法返回元素(属性)的限定名public Namespace getNamespace()该方法返回元素本身的名称空间public java.util.List additionalNamespaces()返回某元素上附加的名称空间声明列表,列表中的每一个对象都是Namespace类型。这个类的方法提供了两个方法分别获得名称空间前缀和本地名。如下:public java.lang.String getPrefix()该方法返回名称空间前缀。public java.lang.String getURI()该方法返回名称空间的URI。六、Qname介绍Qname在使用dom4j的时候,经常见到,一般自己解析的xml很少使用这种复杂格式。1. 来历:qname是qualified name的简写2. 构成:由名字空间(namespace)前缀(prefix)以及冒号(:),还有一个元素名称构成3. 举例:&xsl:stylesheet xmlns:xsl=&http://www.w3.org/1999/XSL/Transform&xmlns=&http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&version=&1.0&&&xsl:template match=&foo&&&hr/&&/xsl:template&&/xsl:stylesheet&xsl是名字空间前缀,template是元素名称,xsl:template 就是一个qname。4.总结:qname无非是有着特定格式的xml元素,其作用主要是增加了名字空间,比如有同样的元素名称,而名字空间不同的情况。七、Visitor模式dom4j对visitor的支持可以大大缩减代码量,并且清楚易懂。这个模式很有用、很实用!自己的类需要继承VisitorSupport,由于VisitorSupport使用适配器模式,可以覆写需要的方法,不需要的方法VisitorSupport提供了空实现。实例代码:MyVisitor,这里将所有可以覆写的visit方法都显示了,可以根据需要覆写package piaohan.util.import org.dom4j.Aimport org.dom4j.CDATA;import org.dom4j.Dimport org.dom4j.DocumentTimport org.dom4j.Eimport org.dom4j.Eimport org.dom4j.Nimport org.dom4j.ProcessingIimport org.dom4j.Timport org.dom4j.VisitorSpublic class MyVisitor extends VisitorSupport {@Overridepublic void visit(Attribute node) {super.visit(node);}@Overridepublic void visit(CDATA node) {super.visit(node);}@Overridepublic void visit(Comment node) {super.visit(node);}@Overridepublic void visit(Document document) {super.visit(document);}@Overridepublic void visit(DocumentType documentType) {super.visit(documentType);}@Overridepublic void visit(Element node) {super.visit(node);}@Overridepublic void visit(Entity node) {super.visit(node);}@Overridepublic void visit(Namespace namespace) {super.visit(namespace);}@Overridepublic void visit(ProcessingInstruction node) {super.visit(node);}@Overridepublic void visit(Text node) {super.visit(node);}}实例代码:例如,这里覆写了处理Element的方法@Overridepublic void visit(Element node) {System.out.println(node.asXML());}实例代码:程序中调用,Element skill = root.element(&skill&);MyVisitor visitor = new MyVisitor();skill.accept(visitor);这样,程序会从skill节点开始,遍历全部子节点和子属性,注释,CDATA等,即遍历skill节点内部的全部元素,由于我的MyVisitor只覆写了Element的处理方法,所以只处理所有的子节点。程序结果:(xml内容见开篇例子)&skill name=&独孤九剑&&&info&为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。&/info&&/skill&&info&为独孤求败所创,变化万千,凌厉无比。其传人主要有风清扬、令狐冲。&/info&清单 1. 示例 XML 文档(catalog.xml)&?xml version=&1.0& encoding=&UTF-8&?&&catalog&&!--An XML Catalog--&&?target instruction?&&journal title=&XML Zone&publisher=&IBM developerWorks&&&article level=&Intermediate& date=&December-2001&&&title&Java configuration with XML Schema&/title&&author&&firstname&Marcello&/firstname&&lastname&Vitaletti&/lastname&&/author&&/article&&/journal&&/catalog&然后使用同一个解析器修改 catalog.xml,清单 2 是修改后的 XML 文档,catalog-modified.xml。清单 2. 修改后的 XML 文档(catalog-modified.xml)&?xml version=&1.0& encoding=&UTF-8&?&&catalog&&!--An XML catalog--&&?target instruction?&&journal title=&XML Zone&publisher=&IBM developerWorks&&&article level=&Introductory& date=&October-2002&&&title&Create flexible and extensible XML schemas&/title&&author&&firstname&Ayesha&/firstname&&lastname&Malik&/lastname&&/author&&/article&&/journal&&/catalog&与 W3C DOM API 相比,使用 dom4j 所包含的解析器的好处是 dom4j 拥有本地的 XPath 支持。DOM 解析器不支持使用 XPath 选择节点。本文包括以下几个部分:预先设置创建文档修改文档预先设置这个解析器可以从 http://dom4j.org 获取。通过设置使 dom4j-1.4/dom4j-full.jar 能够在 classpath 中访问,该文件中包括 dom4j 类、XPath 引擎以及 SAX 和 DOM 接口。如果已经使用了 JAXP 解析器中包含的 SAX 和 DOM 接口,向 classpath 中增加 dom4j-1.4/dom4j.jar 。 dom4j.jar 包括 dom4j 类和 XPath 引擎,但是不含 SAX 与 DOM 接口。回页首创建文档本节讨论使用 dom4j API 创建 XML 文档的过程,并创建示例 XML 文档 catalog.xml。使用 import 语句导入 dom4j API 类:import org.dom4j.Dimport org.dom4j.DocumentHimport org.dom4j.E使用 DocumentHelper 类创建一个文档实例。 DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类。Document document = DocumentHelper.createDocument();使用 addElement() 方法创建根元素 catalog 。 addElement() 用于向 XML 文档中增加元素。Element catalogElement = document.addElement(&catalog&);在 catalog 元素中使用 addComment() 方法添加注释“An XML catalog”。catalogElement.addComment(&An XML catalog&);在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令。catalogElement.addProcessingInstruction(&target&,&text&);在 catalog 元素中使用 addElement() 方法增加 journal 元素。Element journalElement = catalogElement.addElement(&journal&);使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 属性。journalElement.addAttribute(&title&, &XML Zone&);journalElement.addAttribute(&publisher&, &IBM developerWorks&);向 article 元素中添加 journal 元素。Element articleElement=journalElement.addElement(&article&);为 article 元素增加 level 和 date 属性。articleElement.addAttribute(&level&, &Intermediate&);articleElement.addAttribute(&date&, &December-2001&);向 article 元素中增加 title 元素。Element titleElement=articleElement.addElement(&title&);使用 setText() 方法设置 article 元素的文本。titleElement.setText(&Java configuration with XML Schema&);在 article 元素中增加 author 元素。Element authorElement=articleElement.addElement(&author&);在 author 元素中增加 firstname 元素并设置该元素的文本。Element firstNameElement=authorElement.addElement(&firstname&);firstNameElement.setText(&Marcello&);在 author 元素中增加 lastname 元素并设置该元素的文本。Element lastNameElement=authorElement.addElement(&lastname&);lastNameElement.setText(&Vitaletti&);可以使用 addDocType() 方法添加文档类型说明。document.addDocType(&catalog&, null,&file://c:/Dtds/catalog.dtd&);这样就向 XML 文档中增加文档类型说明:&!DOCTYPE catalog SYSTEM &file://c:/Dtds/catalog.dtd&&如果文档要使用文档类型定义(DTD)文档验证则必须有 Doctype。XML 声明 &?xml version=&1.0& encoding=&UTF-8&?& 自动添加到 XML 文档中。清单 3 所示的例子程序 XmlDom4J.java 用于创建 XML 文档 catalog.xml。清单 3. 生成 XML 文档 catalog.xml 的程序(XmlDom4J.java)import org.dom4j.Dimport org.dom4j.DocumentHimport org.dom4j.Eimport org.dom4j.io.XMLWimport java.io.*;public class XmlDom4J{public void generateDocument(){Document document = DocumentHelper.createDocument();Element catalogElement = document.addElement(&catalog&);catalogElement.addComment(&An XML Catalog&);catalogElement.addProcessingInstruction(&target&,&text&);Element journalElement = catalogElement.addElement(&journal&);journalElement.addAttribute(&title&, &XML Zone&);journalElement.addAttribute(&publisher&, &IBM developerWorks&);Element articleElement=journalElement.addElement(&article&);articleElement.addAttribute(&level&, &Intermediate&);articleElement.addAttribute(&date&, &December-2001&);Element titleElement=articleElement.addElement(&title&);titleElement.setText(&Java configuration with XML Schema&);Element authorElement=articleElement.addElement(&author&);Element firstNameElement=authorElement.addElement(&firstname&);firstNameElement.setText(&Marcello&);Element lastNameElement=authorElement.addElement(&lastname&);lastNameElement.setText(&Vitaletti&);document.addDocType(&catalog&,null,&file://c:/Dtds/catalog.dtd&);try{XMLWriter output = new XMLWriter(new FileWriter( new File(&c:/catalog/catalog.xml&) ));output.write( document );output.close();}catch(IOException e){System.out.println(e.getMessage());}}public static void main(String[] argv){XmlDom4J dom4j=new XmlDom4J();dom4j.generateDocument();}}这一节讨论了创建 XML 文档的过程,下一节将介绍使用 dom4j API 修改这里创建的 XML 文档。回页首修改文档这一节说明如何使用 dom4j API 修改示例 XML 文档 catalog.xml。使用 SAXReader 解析 XML 文档 catalog.xml:SAXReader saxReader = new SAXReader();Document document = saxReader.read(inputXml);SAXReader 包含在 org.dom4j.io 包中。inputXml 是从 c:/catalog/catalog.xml 创建的 java.io.File。使用 XPath 表达式从 article 元素中获得 level 节点列表。如果 level 属性值是“Intermediate”则改为“Introductory”。List list = document.selectNodes(&//article/@level& );Iterator iter=list.iterator();while(iter.hasNext()){Attribute attribute=(Attribute)iter.next();if(attribute.getValue().equals(&Intermediate&))attribute.setValue(&Introductory&);}获取 article 元素列表,从 article 元素中的 title 元素得到一个迭代器,并修改 title 元素的文本。list = document.selectNodes(&//article& );iter=list.iterator();while(iter.hasNext()){Element element=(Element)iter.next();Iterator iterator=element.elementIterator(&title&);while(iterator.hasNext()){Element titleElement=(Element)iterator.next();if(titleElement.getText().equals(&Java configuration with XML Schema&))titleElement.setText(&Create flexible and extensible XML schema&);}}通过和 title 元素类似的过程修改 author 元素。清单 4 所示的示例程序 Dom4JParser.java 用于把 catalog.xml 文档修改成 catalog-modified.xml 文档。清单 4. 用于修改 catalog.xml 的程序(Dom4Jparser.java)import org.dom4j.Dimport org.dom4j.Eimport org.dom4j.Aimport java.util.Limport java.util.Iimport org.dom4j.io.XMLWimport java.io.*;import org.dom4j.DocumentEimport org.dom4j.io.SAXRpublic class Dom4JParser{public void modifyDocument(File inputXml){try{SAXReader saxReader = new SAXReader();Document document = saxReader.read(inputXml);List list = document.selectNodes(&//article/@level& );Iterator iter=list.iterator();while(iter.hasNext()){Attribute attribute=(Attribute)iter.next();if(attribute.getValue().equals(&Intermediate&))attribute.setValue(&Introductory&);}list = document.selectNodes(&//article/@date& );iter=list.iterator();while(iter.hasNext()){Attribute attribute=(Attribute)iter.next();if(attribute.getValue().equals(&December-2001&))attribute.setValue(&October-2002&);}list = document.selectNodes(&//article& );iter=list.iterator();while(iter.hasNext()){Element element=(Element)iter.next();Iterator iterator=element.elementIterator(&title&);while(iterator.hasNext()){Element titleElement=(Element)iterator.next();if(titleElement.getText().equals(&Java configuration with XMLSchema&))titleElement.setText(&Create flexible and extensible XML schema&);}}list = document.selectNodes(&//article/author& );iter=list.iterator();while(iter.hasNext()){Element element=(Element)iter.next();Iterator iterator=element.elementIterator(&firstname&);while(iterator.hasNext()){Element firstNameElement=(Element)iterator.next();if(firstNameElement.getText().equals(&Marcello&))firstNameElement.setText(&Ayesha&);}}list = document.selectNodes(&//article/author& );iter=list.iterator();while(iter.hasNext()){Element element=(Element)iter.next();Iterator iterator=element.elementIterator(&lastname&);while(iterator.hasNext()){Element lastNameElement=(Element)iterator.next();if(lastNameElement.getText().equals(&Vitaletti&))lastNameElement.setText(&Malik&);}}XMLWriter output = new XMLWriter(new FileWriter( new File(&c:/catalog/catalog-modified.xml&) ));output.write( document );output.close();}catch(DocumentException e){System.out.println(e.getMessage());}catch(IOException e){System.out.println(e.getMessage());}}public static void main(String[] argv){Dom4JParser dom4jParser=new Dom4JParser();dom4jParser.modifyDocument(new File(&c:/catalog/catalog.xml&));}}自已写的:public void parseXML(){Document document=try {document= new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream(&book.xml&));} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}List books=document.selectNodes(&//书/小说&);for(Iterator iter = books.iterator(); iter.hasNext();){Element element = (Element) iter.next();System.out.println(element.getName());System.out.println(element.getText());System.out.println(element.attributeValue(&name&));}}原文转自:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:297283次
积分:5805
积分:5805
排名:第3387名
原创:293篇
转载:34篇
评论:71条
(1)(1)(1)(1)(6)(2)(7)(8)(5)(1)(2)(2)(14)(11)(7)(5)(10)(5)(5)(4)(23)(77)(90)(18)(12)(11)}

我要回帖

更多关于 org.dom4j qname 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信