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.

Cómo obtener los Atributos XML con XPath en JSDOM

No puedo parecer poder obtener Atributos XML utilizando JSDOM y la sintaxis XPath en este fragmento de código XML.

Por mi entendimiento, PARAGRAPH/DATE/@ISO es una sintaxis XPath válida para el atributo y funciona perfectamente en sitios como Xpather.

Ejemplo mínimo de trabajo:

import { JSDOM } from "jsdom";

const xml = `
<paragraph>
    This is a text, about something, that happened on 
    <date iso="20131117">17.November 2013</date>
    . It is a very important date.
</paragraph>
`;

const dom = new JSDOM(xml, {contentType: "application/xml"});
const doc = dom.window.document;

// 2: XPathResult.STRING_TYPE
const date = doc.evaluate("PARAGRAPH/DATE/@ISO", doc, null, 2, null).stringValue;

console.log(date);

Resultado esperado: "20131117"

Resultado actual: ""

Otros enfoques que no funcionan:
PARAGRAPH//DATE/@ISO,
string(PARAGRAPH/DATE/@ISO), XPath.FIRST_ORDERED_NODE_TYPE

La evaluación parece volver vacía.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay un par de cosas que podrían estar causando el problema aquí.

    En primer lugar, JSDOM podría no estar analizando el XML correctamente. Esto podría deberse al hecho de que el fragmento de XML no está bien formado (no tiene un elemento raíz), o podría deberse a que JSDOM no puede manejar ciertas construcciones XML.

    Para probar esto, puede intentar agregar un elemento raíz al fragmento de XML y ver si JSDOM puede analizarlo correctamente:

    <root>
        <paragraph>
            Este es un texto, sobre algo que sucedió el 
            <date iso="20131117">17 de noviembre de 2013</date>.
            Es una fecha muy importante.
        </paragraph>
    </root>
    

    Y luego modificar el código JS en consecuencia:

    import { JSDOM } from "jsdom";
    
    const xml = `
    <root>
        <paragraph>
            Este es un texto, sobre algo que sucedió el 
            <date iso="20131117">17 de noviembre de 2013</date>.
            Es una fecha muy importante.
        </paragraph>
    </root>
    `;
    
    const dom = new JSDOM(xml, {contentType: "application/xml"});
    const doc = dom.window.document;
    
    // 2: XPathResult.STRING_TYPE
    const date = doc.evaluate("ROOT/PARAGRAPH/DATE/@ISO", doc, null, 2, null).stringValue;
    
    console.log(date);
    

    Si esto funciona, entonces el problema estaba con el XML que no estaba bien formado.

    Si esto no funciona, es posible que JSDOM no pueda manejar ciertas construcciones XML. En este caso, es posible que necesite cambiar a una biblioteca de análisis XML diferente, o extraer manualmente el atributo usando expresiones regulares o manipulación de cadenas.

Comments are closed.