Pregunta

Digamos que en JavaScript se le entrega un único elemento DOM o documento (por ejemplo, window.document), ¿cómo convertiría eso en un XML válido?

Más específicamente para mi ejemplo, tengo una página web que muestra un SVG, este SVG tiene mucho JavaScript para permitir la interacción. Es una pantalla gráfica que le permite hacer zoom en el gráfico e incluso hacer algunas transformaciones. Ahora los usuarios que no tienen esta opción quieren tener una "Guardar imagen" botón. La forma en que me imagino haciendo esto es tomar el nodo del documento para el elemento SVG y convertirlo en XML, luego enviarlo al servidor, que luego devuelve una página con el documento SVG o una imagen PNG.

Todo esto se ejecuta en Firefox (que actualmente es un requisito para los usuarios, aunque también funciona bien en Safari y Chrome). En firefox en la página web, he incluido el documento SVG como un elemento Object. En javascript puedo acceder a ese objeto contentDocument, que se refiere a la raíz de la página XML. Contiene la versión XML, una etiqueta de documento y la etiqueta svg raíz con todos los atributos.

Quizás alguien ya haya resuelto esto, así que puedo copiar su código. Quizás alguien sabe dónde buscar en Firebug para lograr esto. O tal vez ya hay métodos DOM para esto.

¿Fue útil?

Solución

Hay un objeto API no estándar: XMLSerializer (aunque no es estándar es implementado en todos los navegadores excepto IE).

Su método serializeToString espera que se pase el objeto DOMNode.

var sXML = new XMLSerializer().serializeToString(document.body);

En Internet Explorer no hay forma de recuperar XML adecuado para HTML, a menos que obtenga .outerHTML y solucione todos los problemas que vienen con la serialización a HTML (como las comillas faltantes en los atributos, no las etiquetas cerradas, etc.)

Otros consejos

Tendré que buscar en XMLSerializer mañana. Aquí está el código que terminé escribiendo, en caso de que alguien esté interesado (requiere prototipo y FireBug para nodos desconocidos):

function extractXML(node) {
    switch (node.nodeType) {
        case 1: return extractNodeXML(node);
        case 2: return extractAttributeXML(node);
        // 3 = Text node
        case 3: return node.nodeValue;
        // 8 = Comment node - ignore
        case 8: return "";
        case 9: return extractDocumentNodeXML(node);
        case 10: return extractDocumentTypeXML(node);
        default: console.log(node); return "Unkwon type: "+node.nodeType;
    }
}
function extractNodeXML(node) {
    var xml = "<"+node.nodeName;
    $A(node.attributes).each(function (node) {xml += " "+extractXML(node)});
    xml +=">"
    $A(node.childNodes).each(function (node) {xml += extractXML(node)});
    xml += "</"+node.nodeName+">"
    return xml;
}
function extractAttributeXML(node) {
    return node.nodeName+"=\""+node.nodeValue+"\""
}
function extractDocumentNodeXML(node) {
    var xml = "<?xml version=\""+node.xmlVersion+"\" encoding=\""+node.xmlEncoding+"\"?>"
    $A(node.childNodes).each(function (node) {xml += extractXML(node)});
    return xml;
}
function extractDocumentTypeXML(node) {
    return "<!DOCTYPE "+node.name+" PUBLIC \""+node.publicId+"\" \""+node.systemId+"\">"
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top