需求:需要找出xml里的某个特定属性的值并把值复制到一个.properties文件中,目的是做成字典,进行字段映射;要求字段不能重复。
实现:如果字段少的话,直接复制粘贴就行了,但是字段很多,算上重复的话有几千个字段,要是复制粘贴,估计键盘会变成这样:
所以可以写个程序来实现。
思路:
1.遍历读取需要解析的所有文件
2.一个个解析xml文件(这里使用DOM4J解析),获取需要属性的值。
3.使用hashMap存放取到的值(主要目的是去重);
4:遍历hashMap,把值写入到指定的文本文件中。
代码:
新建一个maven工程,引入相关依赖:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
package com.wyw;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.*;
public class ParseXML2 {
private static HashMap<String, String> hashMap = new HashMap<>();
public static void main(String[] args) throws IOException {
//把内容输出到文件中,true表示在文本末尾添加
FileWriter fw = new FileWriter("D:\\files\\测试数据\\文件读取练习\\dictionary.txt", true);
List<String> files = new ArrayList<String>();
//需要读取文件的目录
File file = new File("D:\\files\\测试数据\\文件读取练习");
File[] tempList = file.listFiles();
//获取指定目录下的所有文件的路径包含文件名
for (int i = 0; i < tempList.length; i++) {
if (tempList[i].isFile()) {
files.add(tempList[i].toString());
}
}
//遍历读取指定目录下的所有文件
for (String path : files) {
readXML(path);
}
//遍历hashMap里的数据并把数据写入指定的文本文件中
for (Map.Entry<String, String> entry : hashMap.entrySet()) {
String diction = entry.getKey() + "=" + entry.getValue();
fw.write(diction);
// 换行
fw.write("\r\n");
fw.flush();
}
fw.close();
}
public static void readXML(String file) throws IOException {
SAXReader reader = new SAXReader();
Document doc = null;
try {
doc = reader.read(new File(file));
} catch (DocumentException e) {
e.printStackTrace();
}
//1.获取根元素
Element root = doc.getRootElement();
//2.获取根元素下的所有子元素(通过迭代器)这里是第一个子节点
Iterator<Element> it = root.elementIterator();
while (it.hasNext()) {
Element e = it.next();
//3.获取元素input下的所有子元素(通过迭代器) 这是第二个子节点
Iterator elementIterator = e.elementIterator("input");
while (elementIterator.hasNext()) {
Element element2 = (Element) elementIterator.next();
//4.获取元素field下的所有子元素(通过迭代器) 这是第三个子节点,如果要取得数据还在下个节点的话继续遍历
Iterator elementIterator1 = element2.elementIterator("field");
while (elementIterator1.hasNext()) {
Element element3 = (Element) elementIterator1.next();
//5.获取field节点中name和description属性的值,并把值放入到hashMap中
hashMap.put(element3.attributeValue("name"), element3.attributeValue("description"));
}
}
}
}
}
知识点:
1.解析xml文件,参考:dom4j 解析xml 获取节点值和节点属性
通过Java读取xml文件内容过程解析
2.读取某个目录下的所有文件Java 读取某个目录下所有文件、文件夹