在使用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. Mac eclipse 导入文件夹

    貌似发现了个bug: Eclipse IDE for C/C++ Developers Version: Mars.1 Release (4.5.1)Build id: 20150924-1200 M ...

  2. IIS使用Tip

    1. IIS7 HTTPS 绑定主机头 IIS7下面默认HTTPS绑定是无法指定主机头的,但我们可以通过手工修改IIS配置来实现主机头绑定. 打开C:\Windows\system32\inetsrv ...

  3. c#中文件与二进制流文件的转换

    将文件转换成二进制方法: /// <summary>    /// 将文件转换成二进制    /// </summary>    /// <param name=&quo ...

  4. [C++][数据结构]队列(queue)的实现

    对于队列的定义,前人之述备矣. 队列的实现方法与栈非常相似.我直接在我实现的那个栈的代码上加了一点东西,全局替换了一些标识符,就实现了这个队列. 我实现的是一个queue<value>容器 ...

  5. 为什么kafka使用磁盘而不是内存

    Kafka最核心的思想是使用磁盘,而不是使用内存,可能所有人都会认为,内存的速度一定比磁盘快,我也不例外.在看了Kafka的设计思想,查阅了相应资料再加上自己的测试后,发现磁盘的顺序读写速度和内存持平 ...

  6. mux复用 demux解复用

    保存音频包: 直接输出解复用之后的的音频数据码流.只需要在每次调用av_read_frame()之后将得到的音频的AVPacket存为本地文件即可. 但在分离AAC码流的时候,直接存储AVPacket ...

  7. checkedListBox

    checkedListBox一键删除多个选中items private void button3_Click(object sender, EventArgs e) { ; i < checke ...

  8. iOS 遍历AutoLayout约束

    //遍历footerview约束(一般高,宽) NSArray* constrains = self.footerView.constraints; for (NSLayoutConstraint* ...

  9. Javascript并发模型和事件循环

    Javascript并发模型和事件循环 JavaScript的"并发模型"是基于事件循环的,这个并发模型有别于Java的多线程, javascript的并发是单线程的. Javas ...

  10. ZeroMQ接口函数之 :zmq_close - 关闭ZMQ socket

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_close zmq_close(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_close  ...