我的目标是从包含File对象的嵌套ArrayList在XML文件中生成树结构。我通过扫描硬盘上的目录结构构建了ArrayList。
我希望XML文件看起来类似于以下内容:
<root>
<layer1 name="">
<layer2 name="">
<layer3 name=""></layer3>
</layer2>
<layer1>
</root>
XML应该只代表我的文件夹的层次结构顺序,而name
- 属性应该用文件夹名称填充。
有一种简单的方法可以在Java中实现这一点吗? 提前谢谢!
答案 0 :(得分:0)
我有一个使用a library that supports creation of XML via XPath like expression的解决方案。 (我隶属于该项目)
public class CreateXML {
public static void main(String[] args) {
List<String> fileEntries = Arrays.asList("/path1/path2/file.txt","/path1/path3/path4/file2.txt","/path5/file3.txt");
DOMAccess domAccess = new XBProjector().projectEmptyDocument(DOMAccess.class);
for (String entry:fileEntries) {
String xpath="root";
int i=0;
for (String s:(entry.replaceFirst("\\/", "")).split("\\/")) {
xpath+="/layer"+(++i)+"[@name='"+s+"']";
}
System.out.println(xpath);
domAccess.create(xpath, "");
}
System.out.println(domAccess.asString());
}
}
首先将路径转换为xpath,然后通过这些路径创建元素。程序打印出来:
root/layer1[@name='path1']/layer2[@name='path2']/layer3[@name='file.txt']
root/layer1[@name='path1']/layer2[@name='path3']/layer3[@name='path4']/layer4[@name='file2.txt']
root/layer1[@name='path5']/layer2[@name='file3.txt']
<root>
<layer1 name="path1">
<layer2 name="path2">
<layer3 name="file.txt"/>
</layer2>
<layer2 name="path3">
<layer3 name="path4">
<layer4 name="file2.txt"/>
</layer3>
</layer2>
</layer1>
<layer1 name="path5">
<layer2 name="file3.txt"/>
</layer1>
</root>
答案 1 :(得分:0)
您只需要层次结构中最顶层的文件。如果您不知道哪个可以对列表进行排序,则会将最顶层的文件放在第一个位置。
String parseFile(File file, int layer) {
StringBuilder result = new StringBuilder();
if(file.isDirectory()) {
if(layer == 0) {
result.append("<root>");
for(File childFile : file.listFiles()) {
result.append(parseFile(childFile, layer + 1));
}
result.append("</root>");
}
result.append("<layer"+layer+" name=\""+file.getName()+"\">");
for(File childFile : file.listFiles()) {
result.append(parseFile(childFile, layer + 1));
}
result.append("</layer"+layer+">");
}
return result.toString();
}
这将持续到叶子目录,如果你打算严格解析你需要测试的列表上的文件:
String parseFile(List<File> originalFileList, File file, int layer) {
StringBuilder result = new StringBuilder();
if(file.isDirectory()) {
if(layer == 0) {
result.append("<root>");
for(File childFile : file.listFiles()) {
if(originalFileList.contains(childFile)) {
result.append(parseFile(originalFileList, childFile, layer + 1));
}
}
result.append("</root>");
} else {
result.append("<layer"+layer+" name=\""+file.getName()+"\">");
for(File childFile : file.listFiles()) {
if(originalFileList.contains(childFile)) {
result.append(parseFile(originalFileList, childFile, layer + 1));
}
}
result.append("</layer"+layer+">");
}
}
return result.toString();
}