【问题标题】:Generate XML tree structure from nested ArrayList in Java从 Java 中的嵌套 ArrayList 生成 XML 树结构
【发布时间】:2015-01-16 12:01:06
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 有很多方法可以做到;如果您决定要使用哪个 API(DOM、JDOM、手动编码等),您的选择范围就会缩小。

标签: java xml arraylist hierarchy


【解决方案1】:

我有一个使用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>

【讨论】:

    【解决方案2】:

    您只需要层次结构中最顶层的文件即可。如果您不知道哪个是您可以先对列表进行排序,这会将最顶部的文件放在第一个位置。

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

    【讨论】:

    • XML 永远不应该通过字符串连接手动创建。如果路径包含需要在 XML 中转义的字符怎么办?文件编码呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 2018-04-14
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多