簡體   English   中英

從Java中的嵌套ArrayList生成XML樹結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM