error de nio al analizar el archivo xml

Tengo una función en Jython, esta función usa Popen para ejecutar otro programa que escribe un archivo xml en su stdout, que se dirige a un archivo. Cuando el proceso finaliza, cierro el archivo y llamo a otra función para analizarlo. Recibí un montón de mensajes de error que se refieren al acceso a archivos cerrados y / o archivos xml con formato incorrecto (que aparecen bien cuando los miro) durante el análisis. Pensé que output.close () podría regresar antes de cerrar el archivo, así que agregué un bucle que esperaba que output.closed fuera verdadero. Al principio pareció funcionar pero luego mi programa imprimió lo siguiente

blasting  
blasted  
parsing  
parsed  
    Extending genes found via genemark, 10.00% done  
blasting  
blasted  
parsing  
Exception in thread "_CouplerThread-7 (stdout)" Traceback (most recent call last):  
  File "/Users/mbsulli/jython/Lib/subprocess.py", line 675, in run  
    self.write_func(buf)  
IOError: java.nio.channels.AsynchronousCloseException  
[Fatal Error] 17_2_corr.blastp.xml:15902:63: XML document structures must start and end within the same entity.  
Retry  
blasting  
blasted  
parsing  
Exception in thread "_CouplerThread-9 (stdout)" Traceback (most recent call last):  
  File "/Users/mbsulli/jython/Lib/subprocess.py", line 675, in run  
    self.write_func(buf)  
IOError: java.nio.channels.ClosedChannelException  
[Fatal Error] 17_2_corr.blastp.xml:15890:30: XML document structures must start and end within the same entity.  
Retry  
blasting  

No estoy seguro de cuáles son mis opciones desde aquí. ¿Tenía razón al pensar que el xml no está escrito antes de analizarlo? Si es así, ¿a quién puedo hacer para asegurarme de que sea así?

def parseBlast(fileName):
  """
  A function for parsing XML blast output.
  """
  print "parsing"
  reader = XMLReaderFactory.createXMLReader()
  reader.entityResolver = reader.contentHandler = BlastHandler()
  reader.parse(fileName)
  print "parsed"

  return dict(map(lambda iteration: (iteration.query, iteration), reader.getContentHandler().iterations))

def cachedBlast(fileName, blastLocation, database, eValue, query, pipeline, remote = False, force = False):
  """
  Performs a blast search using the blastp executable and database in blastLocation on
  the query with the eValue.  The result is an XML file saved to fileName.  If fileName
  already exists the search is skipped.  If remote is true then the search is done remotely.
  """
  if not os.path.isfile(fileName) or force:
    output = open(fileName, "w")
    command = [blastLocation + "/bin/blastp",
               "-evalue", str(eValue),
               "-outfmt", "5",
               "-query", query]
    if remote:
      command += ["-remote",
                  "-db", database]
    else:
      command += ["-num_threads", str(Runtime.getRuntime().availableProcessors()),
                  "-db", database]
    print "blasting"
    blastProcess = subprocess.Popen(command,
                                      stdout = output)
    while blastProcess.poll() == None:
      if pipeline.exception:
        print "Stopping in blast"
        blastProcess.kill()
        output.close()
        raise pipeline.exception
    output.close()
    while not output.closed:
      pass
    print "blasted"
  try:
    return parseBlast(fileName)
  except SAXParseException:
    print 'Retry'
    return cachedBlast(fileName, blastLocation, database, eValue, query, pipeline, remote, True)
Respuesta 1

Tengo un archivo XML con algunas etiquetas SOAP que quiero ignorar. Estaba analizando el archivo XML con pull-parser pero dejó de funcionar desde que aparecieron las etiquetas SOAP. El archivo XML se parece a: <? ...

Hii Estoy trabajando en una aplicación donde necesito mostrar imágenes de una carpeta seleccionada por un usuario. Todas las imágenes presentes en la carpeta deben mostrarse. Me gustaría saber cómo mostrarlas ...

Escribí un código que escribe objetos comprimidos en un archivo. Mi pregunta es: ¿hay alguna forma en que pueda realizar un seguimiento del incremento del tamaño de mi archivo a medida que se escribe el objeto? Aquí está mi código: ...

Estoy trabajando en un programa para mover archivos de una carpeta a otra. Tengo alrededor de 1000 archivos y cada archivo se debe mover a una hora fija. En este momento estoy usando un temporizador como: Timer timer = new Timer (); ...