从Java中的嵌套ArrayList生成XML树结构

时间:2015-01-16 12:01:06

标签: java xml arraylist hierarchy

我的目标是从包含File对象的嵌套ArrayList在XML文件中生成树结构。我通过扫描硬盘上的目录结构构建了ArrayList。

我希望XML文件看起来类似于以下内容:

<root>
     <layer1 name="">
        <layer2 name="">
           <layer3 name=""></layer3>
        </layer2>
     <layer1>
</root>

XML应该只代表我的文件夹的层次结构顺序,而name - 属性应该用文件夹名称填充。

有一种简单的方法可以在Java中实现这一点吗? 提前谢谢!

2 个答案:

答案 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();
}