在使用xml读写的过程中,用到了dom4j,也算是一个比较主流的xml包了,在使用的过程中,将学习经历记录一下,以后查阅也比较方便。

首先是在pom中添加依赖,在Maven的中心库搜索后选择了该包:

<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6</version>
</dependency>

添加完这个依赖后就可以使用了dom4j了,但是在使用的过程中发现了问题,在使用selectNodes函数时产生了异常。

后来上网查询发现还缺少了一些dom4j需要的包,于是还是在中心库中搜了搜,填了一堆进去。可能有多,不过总算能正常工作了。添加的依赖如下

        <dependency>
   <groupId>jaxme</groupId>
   <artifactId>jaxme-api</artifactId>
   <version>0.3</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1-beta-4</version>
</dependency>
<dependency>
<groupId>msv</groupId>
<artifactId>xsdlib</artifactId>
<version>20030807</version>
</dependency>
<dependency>
<groupId>msv</groupId>
<artifactId>relaxngDatatype</artifactId>
<version>20030807</version>
</dependency>
<dependency>
<groupId>pull-parser</groupId>
<artifactId>pull-parser</artifactId>
<version>2</version>
</dependency>
<dependency>
<groupId>stax</groupId>
<artifactId>stax</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>junitperf</groupId>
<artifactId>junitperf</artifactId>
<version>1.8</version>
</dependency>
<dependency>
<groupId>stax</groupId>
<artifactId>stax-ri</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>xalan</groupId>
<artifactId>xalan</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>clover</groupId>
<artifactId>clover</artifactId>
<version>1.3-rc4</version>
</dependenc

在添加完dom4j依赖之后,我们来介绍一下常用的xml功能。

1.读取,利用SAXReader进行读取,然后进行后续的解析。

File file=new File(path);
SAXReader sr=new SAXReader();
Document doc=sr.read(file);
Element root=doc.getRootElement();

2.遍历所有节点

public void showElement(Element temp){
for (Iterator it=temp.elementIterator("groupId");it.hasNext();)
{
Element result=(Element)it.next();
if (result.elements().size()>0){
System.out.println(result.getName());
showElement(result);
}
else
{
System.out.println(result.getName()+" "+result.getStringValue());
}
}
}

3.取得当前节点的指定名称的子节点

public void selectNode(String target){
SAXReader saxReader = new SAXReader();
File file = new File("H:\\m.xml");
Document document = null;
try {
document = saxReader.read(file);
} catch (DocumentException e) {
e.printStackTrace();
}
Element met=root.element(target);
System.out.println(met.getText()); }

4.利用selectNode以及selectNodes函数(对于有xmlns的需要特殊处理)

public void selectNode(String target){
Map map = new HashMap();
map.put("ns","http://maven.apache.org/POM/4.0.0");
SAXReader saxReader = new SAXReader();
File file = new File("H:\\m.xml");
saxReader.getDocumentFactory().setXPathNamespaceURIs(map);
Document document = null;
try { document = saxReader.read(file); }
catch (DocumentException e) { e.printStackTrace(); }
List tmp = root.selectNodes("//ns:groupId");// 两个/指的是忽略当前节点位置在全文搜索,不加/则是当前节点的子节点中搜索,不再向深层搜索
System.out.println(tmp.size());
}

对于有命名空间的xml文件,必须采用上面的方法,使用selectNodes和selectSingleNode方法才能找到对应的Element,如果没有xmlns这种命名空间,只需要简单的直接使用即可。

5.遍历属性

public void attributeShow(Element root){
for (Iterator it=root.attributeIterator();it.hasNext();){
Attribute attribute=(Attribute)it.next(); System.out.println(attribute.getName()+":"+attribute.getText());
}
}

6.对于读取xml文件,上面介绍了几种常用方法,下面介绍一下写xml的方法。首先是修改

public void addElement(Document doc){
Element root = doc.getRootElement();
Element added=root.addElement("element1");
added.setText("added value");
added.addAttribute("type","test");
for (Iterator it=root.attributeIterator();it.hasNext();){
Attribute atr=(Attribute)it.next();
atr.setName("change");
atr.setValue("change value");
}
}

上面的例子添加了root的子节点element1 并为这个节点添加了属性和值,修改了root的属性(将所有属性改成一样的了,别在意,只是个例子)

那么接下来就是将改动保存到文件当中了

public void writeToFile(Document document){
try {
FileWriter fw=new FileWriter(path);
document.write(fw);
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}

运行完毕后打开文件就可以看到改动已经被写入了文件。

dom4j提供了一个非常方便的类 DocumentHelper  这个类有很多的静态方法供我们调用,很方便

public void showDocumentHelper(){
Element root=document.getRootElement();
DocumentHelper.createAttribute(root,"attr1","value1");
Document newDoc=DocumentHelper.createDocument();
Element newElement=DocumentHelper.createElement("newElement");
XPath xPath=DocumentHelper.createXPath("path");
List listEle=DocumentHelper.selectNodes("path",root);
}

还有将字符串转为xml以及xml转为字符串

Document document =DocumentHelper.parseText(str);
String docStr=document.getStringValue();
String docStr=documnet.asXML();

再来介绍一下XmlWriter,就是可以写出比较易读的xml 将filewriter包装

XMLWriter xw=new XMLWriter(new FileWriter(new File(path)));

dom4j学习的更多相关文章

  1. dom4j学习总结(一)

    dom4j学习总结(一) (一)创建Document的基本操作 /**  * xml基本操作  */ public void BaseOperation(){  //创建一个document  Doc ...

  2. dom4j 学习总结

    Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platfo ...

  3. dom4J 学习

    Java给我们提供了标准的W3C接口实现,已完成对XML的处理.主要有两大类,分别是DOM操作,SAX解析.DOM可以将XML加载到内存中,对XML进行方便的增删查改.由于是将整个XML都加载到内存中 ...

  4. Dom4j 学习笔记

    dom4j 是一种解析 XML 文档的开放源代码 XML 框架.dom4j下载地址 本文主要记载了一些简单的使用方法. 一.xml文件的解析 dom4j既可以解析普通的xml文件,也可以解析一个Inp ...

  5. Dom4j学习笔记

    一.Loading XML Data 以下代码从File中或一个URL中读取一个XML文件,并产生一个Document对象.一个Document对象表示了内存中的一棵XML树,可以在这个XML树中进行 ...

  6. dom4j处理带命名空间的XML-使用XPath(转)

    dom4j处理带命名空间的XML-使用XPath 博客分类: XML   XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历. XPath 使 ...

  7. XML学习笔记(2)--dom4j操作XML

    1. 介绍(四种方式的比较这部分转载自:http://www.blogjava.net/xcp/archive/2010/02/12/312617.html) 1)DOM(JAXP Crimson解析 ...

  8. java学习笔记DOM4J解析(7)

    DOM4J即Document Object Model for Java使用java技术以文档方式解析XML数据的模型. DOM4J是开源组织提供的一个免费的.强大的XML解析工具,如果开发者需要在项 ...

  9. JavaWeb学习笔记——DOM4J

    下载的地址为:http://www.dom4j.org/dom4j-1.6.1/ import java.io.File; import java.io.FileOutputStream; impor ...

随机推荐

  1. React学习笔记-1-什么是react,react环境搭建以及第一个react实例

    什么是react?react的官方网站:https://facebook.github.io/react/下图这个就是就是react的标志,非常巧合的是他和我们的github的编辑器Atom非常相似. ...

  2. Redhat/Ubuntu/Windows下安装Docker

    Redhat/Ubuntu/Windows下安装Docker 什么是Docker Docker是Docker.inc公司开源的一个基于LXC技术之上构建的Container容器引擎,基于Go语言并遵从 ...

  3. 51nod1089(最长回文子串之manacher算法)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1089 题意:中文题诶~ 思路: 我前面做的那道回文子串的题 ...

  4. PHP基础之POST与GET

    post 与 get区别 *.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示.*.Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1 ...

  5. 首师大附中互测题:LJX的校园:入学典礼【C003】

    [C003]LJX的校园:入学典礼[难度C]—————————————————————————————————————————————————————————————————————————————— ...

  6. 简单CSS3动画制作

    本贴已重新编辑至http://www.cnblogs.com/fastmover/p/4977358.html 最近需要用到了一些CSS3动画,基本用Animate.css(https://githu ...

  7. java基础-泛型1

    浏览以下内容前,请点击并阅读 声明 泛型的使用能使类型名称作为类或者接口定义中的参数,就像一般的参数一样,使得定义的类型通用性更强. 泛型的优势: 编译具有严格的类型检查 java编译器对于泛型代码的 ...

  8. Python for Infomatics 第12章 网络编程五(译)

    注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.8 用urllib读取二进 ...

  9. web Worker使js实现‘多线程’?

    大家都知道js是单线程的,在上一段js执行结束之前,后面的js绝对不会执行,那么为什么标题说js实现‘多线程’,虽然说加了引号,可是标题也不能乱写不是,可恶的标题党? 姑且抛开标题不说,先说我们经常会 ...

  10. js面向对象总结(一)

    在 js 中,对象由特性(attribute)构成,特性可以是原始值,也可以是引用值.如果特性存放的是函数,它将被看作对象的方法(method),否则该特性被看作对象的属性(property).在js ...