2013-02-01 28 views
0

我有以下代碼讀取「struts.xml」(struts2配置文件)。如何在groovy中使用docype讀取XML?

static main(args) { 
    String path = /struts.xml/ 
    String timestamp = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date()) 
    String csvName = "struts2-" + timestamp + ".csv" 

    Node struts = new XmlParser().parse(new File(path)) 

    FileWriter writer = new FileWriter(new File(csvName)) 
    writer.write "#,package,extends,action,method,class\n" 
    int counter = 1; 
    struts.package.each { pck -> 
     pck.action.each { action -> 
      writer.write("${counter++},${[email protected]},${[email protected]},${[email protected]},${Utils.preventNull([email protected])},${[email protected]}\n") 
     } 
    } 
    writer.close() 
    println("File Processed") 
} 

struts.xml中有以下doctype定義。

<!DOCTYPE struts PUBLIC 
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
"http://struts.apache.org/dtds/struts-2.3.dtd"> 

當我從struts.xml中刪除這一行時,代碼完美運行。否則,會給出以下例外。

Exception in thread "main" java.net.UnknownHostException: struts.apache.org 
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:234) 
at java.net.Socket.connect(Socket.java:551) 
at java.net.Socket.connect(Socket.java:501) 
at sun.net.NetworkClient.doConnect(NetworkClient.java:180) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:403) 
at sun.net.www.http.HttpClient.openServer(HttpClient.java:521) 
at sun.net.www.http.HttpClient.<init>(HttpClient.java:246) 
at sun.net.www.http.HttpClient.New(HttpClient.java:320) 
at sun.net.www.http.HttpClient.New(HttpClient.java:337) 
at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:838) 
at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:790) 
at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:715) 
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:959) 
at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
at org.apache.xerces.impl.XMLEntityManager.startEntity(Unknown Source) 
at org.apache.xerces.impl.XMLEntityManager.startDTDEntity(Unknown Source) 
at org.apache.xerces.impl.XMLDTDScannerImpl.setInputSource(Unknown Source) 
at org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher.dispatch(Unknown Source) 
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) 
at groovy.util.XmlParser.parse(XmlParser.java:118) 
at groovy.util.XmlParser$parse.call(Unknown Source) 
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:42) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108) 
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) 
at demo.main(Struts2ConfigurationReader.groovy:14) 

我錯過了什麼?

回答

3

我假設你沒有互聯網連接,你在做解析?

您可以通過分析程序的功能關閉這個功能:

替換:

Node struts = new XmlParser().parse(new File(path)) 

XmlParser parser = new XmlParser() 
parser.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false) 
Node struts = parser.parse(new File(path)) 

PS:你也可以做的與常規以下:

  • 刪除static main(args) - 假設這是一個腳本,這是不必要的
  • 變化:

    String path = /struts.xml/ 
    String timestamp = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date()) 
    String csvName = "struts2-" + timestamp + ".csv" 
    

    String path = 'struts.xml' 
    String timestamp = new Date().format('yyyy-MM-dd_HH-mm-ss') 
    String csvName = "struts2-${timestamp}.csv" 
    
  • 而且使用File.withWriter可能更容易讀/代碼。這樣的:

    FileWriter writer = new FileWriter(new File(csvName)) 
    writer.write "#,package,extends,action,method,class\n" 
    .... 
    writer.close() 
    

    可以寫爲:

    new File(csvName).withWriter { writer -> 
        writer.writeLine "#,package,extends,action,method,class" 
        .... 
    } 
    
+0

這比答案更多。很有幫助。 –