es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para escribir la siguiente línea en XML sin convertirla en &lt;![CDATA[execfile(&quot;C:\users\me\run.py&quot;)]]&gt;, puedes utilizar el método xml.sax.saxutils.unescape() para desescapar la cadena antes de añadirla como texto del elemento scriptEl. Así es cómo puedes modificar tu código en Python para lograr esto:

    import os
    import sys
    import xml.dom.minidom
    import xml.etree.ElementTree as ET
    import xml.sax.saxutils
    
    root = ET.Element('shelfDocument')
    scriptItemEl = ET.SubElement(root, 'tool', name='MyTool', label='MyTool')
    
    cmd = '<![CDATA[execfile("C:\\users\\me\\run.py")]]>'
    cmd_unescaped = xml.sax.saxutils.unescape(cmd)
    scriptEl = ET.SubElement(scriptItemEl, 'script', scriptType='python')
    scriptEl.text = '{}'.format(cmd_unescaped)
    
    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)
    

    Ten en cuenta que estamos utilizando xml.sax.saxutils.unescape() para desescapar la cadena cmd antes de asignarla a scriptEl.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 cadena cmd para evitar tener que escapar las comillas dobles (") utilizadas en la ruta del archivo.

Comments are closed.