2011-12-29 11 views
5

Para una prueba unitaria, quiero poder verificar si un determinado objeto devuelto es un documento XML. ¿Cual es la mejor manera de hacerlo?¿Cómo debo probar si un objeto es un documento XML (de forma cruzada)

Actualmente estoy probando doc.implementation (la primera propiedad de DOM que me vino a la mente) pero ¿hay una mejor manera? Además, ¿hay una buena manera de diferenciar los documentos XML de los documentos HTML?

+0

'doc.doctype' es el nodo de tipo de documento. El nodo doctype debe ser XHTML en lugar de html. – Raynos

+0

Mis documentos no son XHTML, entonces no tienen doctype. Pero gracias por el consejo. – hugomg

Respuesta

1
function isXML(xmlStr){ 
    var parseXml; 

    if (typeof window.DOMParser != "undefined") { 
    parseXml = function(xmlStr) { 
     return (new window.DOMParser()).parseFromString(xmlStr, "text/xml"); 
    }; 
    } else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) { 
    parseXml = function(xmlStr) { 
     var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM"); 
     xmlDoc.async = "false"; 
     xmlDoc.loadXML(xmlStr); 
     return xmlDoc; 
    }; 
    } else { 
    return false; 
    } 

    try { 
    parseXml(xmlStr); 
    } catch (e) { 
    return false; 
    } 
    return true;  
} 
0

Estoy asumiendo que usted está haciendo actualmente una implementación similar a

Si ese es el caso, ya sé que no es bonito, pero podría no simplemente lo envuelve en try/catch? O bien, ¿necesita saber si es XML y específicamente no de otro tipo? Si ese es el caso, no estoy seguro de poder hacerlo sin hacer otras afirmaciones. Una captura de prueba al menos le permitirá crear un documento XML desde un objeto sin lanzar un error a la pantalla. Podría suponer entonces que si carga en DOM que ES válido XML.

+0

Esto es para escribir una ** prueba de unidad **. Necesito poder verificar si cierta función que se supone que devuelve un documento XML realmente lo hace. – hugomg

3

Me gustaría echar un vistazo a la implementación de jQuery.isXMLDoc para ideas. Resulta que el código en sí está en la biblioteca chisporroteo, here:

Sizzle.isXML = function(elem) { 
    // documentElement is verified for cases where it doesn't yet exist 
    // (such as loading iframes in IE - #4833) 
    var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; 

    return documentElement ? documentElement.nodeName !== "HTML" : false; 
}; 
Cuestiones relacionadas