<commit_before>---
layout: post
title: 使用Dom4J解析Xml文件
categories: JavaWeb
description: 使用Dom4J解析Xml文件
keywords: Java，Dom4J，XML
---

　　dom4j是一个Java的XML API，是jdom的升级品，用来读写XML文件的。dom4j是一个十分优秀的JavaXML API，具有性能优异、功能强大和极其易使用的特点，它的性能超过sun公司官方的dom技术，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。

## 1.读取XML文件，获取Document对象

注意：使用SAXReader的read(File file)方法时，如果xml文件异常会导致文件被服务器占用不能移动文件，建议不使用read(File file)方法而使用read(FileInputStream fis)等流的方式读取文件，异常时关闭流，这样就不会造成流未关闭，文件被锁的现象了。

```java
// 1.得到解析器
SAXReader reader = new SAXReader();
// 2. 加载文件
InputStream inputStream = this.getClass().getResourceAsStream("/controller.xml");
Document doc = reader.read(inputStream);
```

## 2.节点对象操作的方法

```java
	1.获取文档的根节点.  
      Element root = document.getRootElement();  
    2.取得某个节点的子节点.  
      Element element=node.element(“四大名著");  
    3.取得节点的文字  
      String text=node.getText();  
    4.取得某节点下所有名为“csdn”的子节点，并进行遍历.  
      List nodes = rootElm.elements("csdn");  
      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 elm = newElm.addElement("朝代");  
    7.设置节点文字.  
	  elm.setText("明朝");  
    8.删除某节点,childElement是待删除的节点,parentElement是其父节点
      parentElement.remove(childElment);
    9.添加一个CDATA节点.
	  Element contentElm = infoElm.addElement("content");
	  contentElm.addCDATA(“cdata区域”);
```

## 3.将文档写入XML文件

```java
	1.文档中全为英文,不设置编码,直接写入的形式.    
       XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml"));   
       writer.write(document);    
       writer.close();  
    2.文档中含有中文,设置编码格式写入的形式.  
	   // 创建文件输出的时候，自动缩进的格式        
       OutputFormat format = OutputFormat.createPrettyPrint();
       format.setEncoding("UTF-8");//设置编码  
       XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);  
       writer.write(document);  
       writer.close();  
```

## 4.字符串与XML的转换

```java
	1.将字符串转化为XML  
      String text = "<csdn> <java>Java班</java></csdn>";  
      Document document = DocumentHelper.parseText(text);  
    2.将文档或节点的XML转化为字符串.  
      SAXReader reader = new SAXReader();  
      Document document = reader.read(new File("csdn.xml"));              
      Element root=document.getRootElement();      
      String docXmlText=document.asXML();  
      String rootXmlText=root.asXML();  
	  Element memberElm=root.element("csdn");  
      String memberXmlText=memberElm.asXML();  
```

## 5.案例(解析sida.xml文件并对其进行curd的操作)

#### 5.1.sida.xml描述四大名著的操作，文件内容如下

```java
<?xml version="1.0" encoding="UTF-8"?>  
<四大名著>  
    <西游记 id="x001">  
        <作者>吴承恩1</作者>  
        <作者>吴承恩2</作者>  
        <朝代>明朝</朝代>  
    </西游记>  
    <红楼梦 id="x002">  
        <作者>曹雪芹</作者>  
    </红楼梦>  
</四大名著>  
```

#### 5.2.解析类测试操作
<commit_msg>add 2016-12-05-dom4j-parse-xml<commit_after>---
layout: post
title: 使用Dom4J解析Xml文件
categories: JavaWeb
description: 使用Dom4J解析Xml文件
keywords: Java，Dom4J，XML
---

　　dom4j是一个Java的XML API，是jdom的升级品，用来读写XML文件的。dom4j是一个十分优秀的JavaXML API，具有性能优异、功能强大和极其易使用的特点，它的性能超过sun公司官方的dom技术，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。

## 1.读取XML文件，获取Document对象

　　注意：使用SAXReader的read(File file)方法时，如果xml文件异常会导致文件被服务器占用不能移动文件，建议不使用read(File file)方法而使用read(FileInputStream fis)等流的方式读取文件，异常时关闭流，这样就不会造成流未关闭，文件被锁的现象了。

```java
// 1.得到解析器
SAXReader reader = new SAXReader();
// 2. 加载文件
InputStream inputStream = this.getClass().getResourceAsStream("/controller.xml");
Document doc = reader.read(inputStream);
```

## 2.节点对象操作的方法

```java
1.获取文档的根节点.  
  Element root = document.getRootElement();  
2.取得某个节点的子节点.  
  Element element=node.element(“四大名著");  
3.取得节点的文字  
  String text=node.getText();  
4.取得某节点下所有名为“csdn”的子节点，并进行遍历.  
  List nodes = rootElm.elements("csdn");  
  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 elm = newElm.addElement("朝代");  
7.设置节点文字.  
  elm.setText("明朝");  
8.删除某节点,childElement是待删除的节点,parentElement是其父节点
  parentElement.remove(childElment);
9.添加一个CDATA节点.
  Element contentElm = infoElm.addElement("content");
  contentElm.addCDATA(“cdata区域”);
```

## 3.将文档写入XML文件

```java
1.文档中全为英文,不设置编码,直接写入的形式.    
  XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml"));   
  writer.write(document);    
  writer.close();  
2.文档中含有中文,设置编码格式写入的形式.  
  // 创建文件输出的时候，自动缩进的格式        
  OutputFormat format = OutputFormat.createPrettyPrint();
  format.setEncoding("UTF-8");//设置编码  
  XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);  
  writer.write(document);  
  writer.close();  
```

## 4.字符串与XML的转换

```java
1.将字符串转化为XML  
  String text = "<csdn> <java>Java班</java></csdn>";  
  Document document = DocumentHelper.parseText(text);  
2.将文档或节点的XML转化为字符串.  
  SAXReader reader = new SAXReader();  
  Document document = reader.read(new File("csdn.xml"));              
  Element root=document.getRootElement();      
  String docXmlText=document.asXML();  
  String rootXmlText=root.asXML();  
  Element memberElm=root.element("csdn");  
  String memberXmlText=memberElm.asXML();  
```

## 5.案例(解析sida.xml文件并对其进行curd的操作)

#### 5.1.sida.xml描述四大名著的操作，文件内容如下

```java
<?xml version="1.0" encoding="UTF-8"?>  
<四大名著>  
    <西游记 id="x001">  
        <作者>吴承恩1</作者>  
        <作者>吴承恩2</作者>  
        <朝代>明朝</朝代>  
    </西游记>  
    <红楼梦 id="x002">  
        <作者>曹雪芹</作者>  
    </红楼梦>  
</四大名著>  
```

#### 5.2.解析类测试操作

{'fraction_non_alphanumeric': 0.1475609756097561, 'fraction_numerical': 0.015853658536585366, 'mean_word_length': 3.290732436472347, 'pattern_counts': {'":': 0, '<': 41, '<?xml version=': 2, '>': 41, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 17}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5921538', 'n_tokens_mistral': 2720, 'n_tokens_neox': 2910, 'n_words': 305}