Tengo el siguiente script:

count = 1
for line in temp:
    if (str(count) + '=') in line:
        job = re.findall(re.escape('=')+"(.*)",line)[0]

        fullsrcurl = self.srcjson + '?format=xml&jobname=' + job
        srcfile = urllib2.urlopen(fullsrcurl)
        srcdoc = etree.parse(srcfile)
        srcdata = etree.tostring(srcdoc, pretty_print=True)
        srcjobmst_id = srcdoc.xpath('//jobmst_id/text()')[0]
        srcxml = 'c:\\temp\\deployments\\%s\\%s.xml' % (source_env, srcjobmst_id)
        srcxmlsave = open(srcxml, 'w')
        srcxmlsave.write(srcdata)
        srcxmlsave.close

        fulldsturl = self.targetjson + '?format=xml&jobname=' + job
        dstfile = urllib2.urlopen(fulldsturl)
        dstdoc = etree.parse(dstfile)
        dstdata = etree.tostring(dstdoc, pretty_print=True)
        dstjobmst_id = dstdoc.xpath('//jobmst_id/text()')[0]
        dstxml = 'c:\\temp\\deployments\\%s\\%s.xml' % (target_env, dstjobmst_id)
        dstxmlsave = open(dstxml, 'w')
        dstxmlsave.write(dstdata)
        dstxmlsave.close

        print "Job = " + job
        count += 1

Está llegando a 2 API separadas en 2 entornos, pero los datos son casi idénticos. La fuente funciona bien, tan pronto como intenta hacer algo con los datos de destino, aparece el siguiente error:

Traceback (most recent call last):
  File "S:\Operations\Tidal\deployment\deployv2.py", line 213, in <module>
    main()
  File "S:\Operations\Tidal\deployment\deployv2.py", line 209, in main
    auto_deploy.deploy()
  File "S:\Operations\Tidal\deployment\deployv2.py", line 173, in deploy
    dstdoc = etree.parse(dstfile)
  File "lxml.etree.pyx", line 3239, in lxml.etree.parse (src\lxml\lxml.etree.c:6
9970)
  File "parser.pxi", line 1770, in lxml.etree._parseDocument (src\lxml\lxml.etre
e.c:102272)
  File "parser.pxi", line 1790, in lxml.etree._parseFilelikeDocument (src\lxml\l
xml.etree.c:102531)
  File "parser.pxi", line 1685, in lxml.etree._parseDocFromFilelike (src\lxml\lx
ml.etree.c:101457)
  File "parser.pxi", line 1134, in lxml.etree._BaseParser._parseDocFromFilelike
(src\lxml\lxml.etree.c:97084)
  File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDo
c (src\lxml\lxml.etree.c:91290)
  File "parser.pxi", line 683, in lxml.etree._handleParseResult (src\lxml\lxml.e
tree.c:92476)
  File "parser.pxi", line 622, in lxml.etree._raiseParseError (src\lxml\lxml.etr
ee.c:91772)
lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 4, col
umn 1

Entonces, tiene que haber algo diferente sobre el xml de destino / destino, pero me cuesta entender qué. Cuando miro ambos valores en un navegador son idénticos, excepto por algunos valores (jobmst_id)

0
whoisearth 30 ago. 2014 a las 02:55

2 respuestas

La mejor respuesta

Si alguien experimenta un problema como este en el futuro, encontré el problema y no está relacionado con lxml o el xml que estoy generando. Mi entorno de origen se ha producido en producción usando mod_wsgi pero el entorno de destino todavía está usando runserver.

Supongo que algo en la codificación está rompiendo con el objetivo. Acabo de producir el entorno objetivo y funciona bien.

0
whoisearth 30 ago. 2014 a las 00:20

No estás cerrando los archivos. Cambie srcxmlsave.close a srcxmlsave.close() o use un administrador de contexto como en

with open(srcxml, 'w') as srcxmlsave:
    srcxmlsave.write(srcdata)
1
tdelaney 29 ago. 2014 a las 23:11