2011-06-02 5 views
0

J'ai ce morceau de code qui donne à SAXParseError, c'est-à-dire, il n'obtient pas le contenu, mais la même chose quand je l'utilise dans mon test pg cela fonctionne correctement. Ici, je fournirai mon morceau de code d'origine, any1 peut comprendre ce qui est le problèmeorg.xml.sax.SAXParseException: fin prématurée du fichier

Ceci est la partie où I fetch a xml and append a node to it mais il semble que je ne suis pas en mesure d'obtenir le fichier lui-même

String atemp=readFileAsString("../webapps/abc/include/xml/data.xml") 

     log.info("ok thats good") 

     String[] splitString=res.split(",") 

     log.info(atemp) 

     try 
     { 
      def root = new XmlSlurper().parseText(atemp) 
     } 
     catch(Exception e) 
     { 
      log.debug("parse errror: "+e) 
     } 
     root.appendNode { 
      row { 
      name(splitString[1]) 
      host(splitString[2]) 
      desc(splitString[3]) 
      product(splitString[4]) 
      type(splitString[5]) 
      time(splitString[6]) 
      by(splitString[7]) 
      } 
     } 

     def outputBuilder = new StreamingMarkupBuilder() 
     String temp = outputBuilder.bind{ mkp.yield root } 

     File file = new File("../webapps/abc/include/xml/data.xml"); 
     BufferedWriter output = new BufferedWriter(new FileWriter(file)); 
     output.write(temp); 
     output.close(); 
     log.info(temp) 

mon readFileAsString fonction

private String readFileAsString(String filePath) { 
    try 
    { 
     StringBuffer fileData = new StringBuffer(); 
     BufferedReader reader = new BufferedReader(new FileReader(filePath)); 
     log.info(reader==null); 
     char[] buf = new char[1024]; 
     int numRead=0; 
     while((numRead=reader.read(buf)) != -1){ 
      String readData = String.valueOf(buf, 0, numRead); 
      fileData.append(readData); 
      log.info(readData) 
     } 
     reader.close(); 
     log.info("File Content\n"+fileData.toString()); 
     return fileData.toString(); 
    } 
    catch (Exception e) 
    { 
     log.info(e); 
    } 
} 

sortie

INFO http-5050-Processor24 com.abc.helper.WriteXml - false 
INFO http-5050-Processor24 com.abc.helper.WriteXml - File Content 
INFO http-5050-Processor24 com.abc.helper.WriteXml - ok thats good 

Remarque: Je suis en mesure d'ouvrir le fichier dans mon programme de test avec le même chemin

+0

Votre 'readFileAsString' ne prend pas en compte le [codage de document] (http://www.w3.org/TR/xml/#sec-guessing). – McDowell

Répondre

1

En supposant qu'il est en Groovy, je crois que vous pouvez remplacer tous votre code avec:

File f = new File('../webapps/abc/include/xml/data.xml') 
def root = new XmlSlurper().parse(f) 
String[] splitString = res.split(',') 
root.appendNode { 
    row { 
    name(splitString[1]) 
    host(splitString[2]) 
    desc(splitString[3]) 
    product(splitString[4]) 
    type(splitString[5]) 
    time(splitString[6]) 
    by(splitString[7]) 
    } 
} 
def outputBuilder = new StreamingMarkupBuilder() 
String newXml = outputBuilder.bind{ mkp.yield root } 
f.text = newXml 

Mais je répète, le faire dans une application Web est probablement une mauvaise idée, car si deux threads appellent ce code en même temps, le fichier va être imprévisible (et obtenir de plus plus imprévisible car il devient plus grand)

En outre, vous voudrez peut-être changer:

File f = new File('../webapps/abc/include/xml/data.xml') 

à

File f = new File("${System.properties['catalina.base']}/webapps/abc/include/xml/data.xml") 

Comme vous suggéré in a previous question of yours

+0

: tim: que fait f.text = newXml'? – abi1964

+1

@Abhishek Ecrase le texte dans le fichier 'f' avec le contenu de la chaîne' newXml' ... voir [les docs] (http://groovy.codehaus.org/groovy-jdk/java/io/Fichier. html # setText% 28java.lang.String% 29) –

+0

Merci tim :) résolu mon problème – abi1964

0

La méthode readFileAsString semble OK, mais si la sortie du journal est de croire alors votre application lit un fichier vide, et c'est ce qui provoque l'exception d'analyse XML. La première chose à vérifier est que le chemin d'accès du fichier que vous essayez de lire est correct, et que le fichier à cet emplacement n'est pas réellement vide. Essayez d'ajouter cette ligne au début de readFileAsString

log.info("file size is " + new File(filePath).length()); 

Notez que zéro signifie soit que le fichier n'existe pas, ou il est vide.


En regardant le reste du code, l'application semble lire le fichier, faire quelque chose à lui puis écrire de nouveau au même endroit. Considérez la possibilité que c'est le code qui génère la sortie qui est cassée ... et votre application essaye de lire et d'analyser un fichier qu'il a déjà clobé.

Questions connexes