生成XML步骤:
- 生成根节点(root);
- 判断root节点,是否有子节点,生成root节点子节点(二级节点);
- 判断root节点的节点(二级节点)是否有子节点(三级节点);
- 3这2步骤就可以写成递归,在写一个判断是否有子节点的函数和中文格式化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129/**
* 创建文件的Xml
*
* @param filename
* @param map
* @return
* @throws Exception
*/
public Map<String, String> createXMLFile(String filename, Map<String, List<String>> map) throws Exception{
// 存放 file下每一个对象的值
Map<String, String> mapString = new LinkedHashMap<String, String>();
// 取得所有key
Set<String> set = map.keySet();
Iterator<String> iterator = set.iterator();
Document document = null;
while (iterator.hasNext()) {
// 建立document对象
document = DocumentHelper.createDocument();
// 加入第一个节点
String keyString = iterator.next();
String[] arrayString = keyString.split(",");
String idString = arrayString[0];
String nameString = arrayString[1];
String pIdString = arrayString[2];
Integer id = Integer.parseInt(arrayString[3]);
String fileID = arrayString[4];
String fileName = arrayString[5];
String path = arrayString[6];
// 判断根节点 创建root
if ("-2".equals(pIdString)) {
// 建立XML文档的根root
Element rootElement = document.addElement(nameString);
Integer nodeID = Integer.parseInt(idString);
// 判断根节点的子节点
isFileChild(map, rootElement, nodeID, id, fileID);
}
// 将document中的内容写入文件中,生成一个xml
XMLWriter writer = new XMLWriter(new FileWriter(new java.io.File(filename)));
writer.write(document);
writer.close();
// 读取xml
StringBuilder stringBuilder = new StringBuilder();
File file = new File(filename);
BufferedReader bf = new BufferedReader(new FileReader(file));
String temp;
while ((temp = bf.readLine()) != null) {
stringBuilder.append(temp);
}
//判断xml是否是空
if (!"<?xml version=\"1.0\" encoding=\"UTF-8\"?>".equals(stringBuilder.toString())) {
String data = stringBuilder.toString();
String kString = id.toString() + "," + fileName + "," + path;
mapString.put(kString, data);
}
}
return mapString;
}
/**
* 文件xml-获取 当前节点 是 其他节点的父节点
*
* @param map
* @param element
* 当前文件节点
* @param nodeId
* 当前文件content的id
* @param id
* @param fileID
* 当前文件节点id
* @throws Exception
*/
public void isFileChild(Map<String, List<String>> map, Element element, Integer nodeId, Integer id, String fileID) throws Exception{
Set<String> set = map.keySet();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String kString = it.next();
String[] setString = kString.split(",");
// 当前节点id 是 其他节点的父id,当前节点有子节点, 属于同一个文件
if (!"root".equals(setString[2]) && id == Integer.parseInt((setString[3])) && Integer.parseInt(setString[2]) == nodeId && setString[4].equals(fileID)) {
List<String> valueList = map.get(kString);
//创建当前节点的xml
Element nodElement = createFileXML(element, valueList, kString);
Integer cid = Integer.parseInt(setString[0]);
// 查询当前节点是否有子节点,有子节点,传递当前节点
isFileChild(map, nodElement, cid, Integer.parseInt(setString[3]), setString[4]);
}
}
}
/**
* 创建节点的xml
*
* @param element
* 当前节点
* @param list
* @param keyString
* @return
* @throws Exception
*/
public Element createFileXML(Element element, List<String> list, String keyString) throws Exception{
String[] kStrings = keyString.split(",");
//添加节点
Element nodeEle = element.addElement(kStrings[1]);
for (int i = 0; i < list.size(); i++) {
String data = list.get(i);
String[] dataStrings = data.split(",");
//添加属性
nodeEle.addAttribute(dataStrings[0], dataStrings[1]);
}
return nodeEle;
}
/**
* 格式化XML文档,并解决中文问题
*
* @param filename
* @return
*/
public void formatXML(Document document, String filename) throws Exception{
XMLWriter writer = null;
OutputFormat format = OutputFormat.createPrettyPrint();
// 指定XML编码
format.setEncoding("utf-8");
//格式化XML文件
writer = new XMLWriter(new FileWriter(new File(filename)), format);
//输出XML文件
writer.write(document);
writer.close();
}