[英]Generate XML tree structure from nested ArrayList in Java
我的目標是從包含File對象的嵌套ArrayList的XML文件中生成樹結構。 我通過掃描硬盤上的目錄結構來構造ArrayList。
我希望XML文件看起來類似於以下內容:
<root>
<layer1 name="">
<layer2 name="">
<layer3 name=""></layer3>
</layer2>
<layer1>
</root>
XML應該只代表我的文件夾的層次結構順序,而name
-attributes應該用文件夾名稱填充。
有沒有簡單的方法可以在Java中實現呢? 提前致謝!
我有一個使用庫的解決方案, 該庫支持通過XPath之類的expression創建XML 。 (我隸屬於該項目)
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>
為此,您僅需要層次結構中最頂層的文件。 如果您不知道是哪個,可以先對列表進行排序,這會將最上面的文件放在第一位。
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.