Escribiendo la sección CDATA en un archivo XML.
Estoy tratando de crear un archivo XML imitando el archivo XML de otra aplicación. No puedo averiguar cómo escribir la siguiente línea en XML…
Siempre quiere convertirlo a
El resultado completo actualmente se ve así.
<?xml version="1.0" encoding="UTF-8"?>
<shelfdocument>
<tool name="MyTool" label="MyTool">
<script scripttype="python"><![CDATA[execfile("C:\users\me\run.py")]]></script>
</tool>
</shelfdocument>
Necesito que se vea así
<?xml version="1.0" encoding="UTF-8"?>
<shelfdocument>
<tool name="MyTool" label="MyTool">
<script scripttype="python">
<![CDATA[execfile("C:\users\me\run.py")]]>
</script>
</tool>
</shelfdocument>
Aquí está mi código Python…
import os
import sys
import xml.dom.minidom
import xml.etree.ElementTree as ET
root = ET.Element('shelfDocument')
scriptItemEl = ET.SubElement(root, 'tool', name='MyTool', label='MyTool')
cmd = '<![CDATA[execfile("{}")]]>'.format('C:\users\me\run.py')
scriptEl = ET.SubElement(scriptItemEl, 'script', scriptType='python')
scriptEl.text = '{}'.format(cmd)
xmlstr = ET.tostring(root, encoding='UTF-8', method="xml")
xmlObj = xml.dom.minidom.parseString(xmlstr)
xmlstr = xmlObj.toprettyxml(encoding='UTF-8')
filepath = 'output.xml'
with open(filepath, 'wb') as output:
output.write(xmlstr)
davy.ai
Para escribir la siguiente línea en XML sin convertirla en
<![CDATA[execfile("C:\users\me\run.py")]]>
, puedes utilizar el métodoxml.sax.saxutils.unescape()
para desescapar la cadena antes de añadirla como texto del elementoscriptEl
. Así es cómo puedes modificar tu código en Python para lograr esto:Ten en cuenta que estamos utilizando
xml.sax.saxutils.unescape()
para desescapar la cadenacmd
antes de asignarla ascriptEl.text
. Esto asegurará que la cadena no esté doblemente escapada y el resultado del XML contendrá el elemento<![CDATA[execfile("C:\users\me\run.py")]]>
deseado.Además, ten en cuenta que debes utilizar comillas simples (
'
) alrededor de la cadenacmd
para evitar tener que escapar las comillas dobles ("
) utilizadas en la ruta del archivo.