2012-03-08 44 views
5

我在閱讀具有特定組件下大量歸檔的列表。 例如生成遞歸目錄搜索的XML映射

component1:filelocation1/a11.ear 
component1:filelocation1/a12.ear 
component2:filelocation2/a2.ear 
component3:filelocation3/a3.ear 
component4:filelocation3/basefile.properties 

我需要遞歸解壓每個存檔,直到數據的最後一個級別,並生成一個XML映射文件捕獲來自該組件的正確映射到存檔的最後一個元素。

其中的XML文檔結構將是這樣的:

<my-app> 
    <mapping> 
    <toplevel loc="filelocation1" filename="a11.ear" component="component1"> 
     <childlevel loc="." filename="x1.war"> 
      <childlevel loc="WEB-INF/classes" filename="abc1.class"/> 
      <childlevel loc="WEB-INF/classes" filename="abc2.class"/> 
     </childlevel> 
    </toplevel> 
    <toplevel loc="filelocation1" filename="a12.ear" component="component1"> 
     <childlevel loc="." filename="x2.jar"> 
     <childlevel loc="org/test" filename="abc1.class"/> 
     <childlevel loc="org/test" filename="abc2.class"/> 
     </childlevel> 
     <childlevel loc="." filename="x3.war"> 
      <childlevel loc="WEB-INF/lib" filename="web1.jar"> 
      <childlevel loc="org/test" filename="abc1.class"/> 
     </childlevel> 
     <childlevel loc="WEB-INF/classes" filename="abc2.class"/> 
     </childlevel> 
    </toplevel> 
    </mapping> 
    </my-app> 

什麼是做到這一點的最好appraoch?我正在考慮使用DOM解析器來生成XML。

+0

只需添加 - 該過程包括從文本文件中讀取文件列表,以遞歸方式解壓每個檔案,並在構建XML映射時解壓縮它。因此,遞歸調用來擴展一個存檔將需要以某種方式傳遞父元素,以便一旦它退出遞歸循環,我們就可以擁有正確的xml。這個xml將爲我們開始的文本文件中的所有存檔提供數據。 – rommel 2012-03-09 07:56:58

+0

您是否有任何偏好用於XML處理的語言? – menjaraz 2012-03-22 14:37:54

+0

如果它與您以前的帖子有關,您可以添加[tag:java]標籤。 – menjaraz 2012-03-22 14:44:09

回答

0

我會這樣做,使用gradle

Gradle有很好的內置解壓檔案設施。您可以使用groovy(附帶gradle)進行XML解析/生成,這比使用Java XML庫要乾淨得多。

1

由於JAR文件也是ZIP文件,如果您打算在Java中執行此操作,我會使用java.util.zip庫。雖然您仍然需要遞歸地打開嵌入WAR和EAR中的任何JAR,但它將爲您節省通過包含平面文件的目錄的麻煩。您也可以使用java.util.zip庫提供的ZipFile的JarFile子類。

http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipFile.html

我也可能不會有DOM解析器只是打印出XML打擾。你會在內存中建立一個(可能很大的)結構,而不是將數據打印到流中。另外,解析器用於將XML解析爲數據結構,而不是相反。標準的Java DOM解析類javax.xml.parsers.DocumentBuilderFactory和javax.xml.parsers.DocumentBuilder不帶有「print」命令。從org.w3c.dom.Document對象創建格式化文本輸出的標準方法是使用XSL變換器(請參閱http://java.sun.com/webservices/reference/tutorials/jaxp/html/xslt.html#gghkq),而且這可能比它的價值更麻煩。我想這取決於你想要擴展這個程序的多少,但是如果你在這裏有它所需要做的,我不會構建一個大的DOM對象。