2012-06-29 14 views
6

Estoy tratando de convertir XML a JSON en node.js utilizando el módulo xml2js. ¿Cómo manejo el alias del espacio de nombres al acceder a las variables?XML a JSON: trata de espacios de nombres xml y alias en JavaScript

El código de seguimiento convierte mi archivo (sampleWithNamespaces.xml)

var fs = require('fs'), 
xml2js = require('xml2js'); 

var parser = new xml2js.Parser(); 
fs.readFile('sampleWithNamespaces.xml', function (err, data) { 
    parser.parseString(data, function (err, result) { 
     console.dir(result); 
     console.log('Done'); 
    }); 
}); 

sampleWithNamespaces.xml:

<d:student xmlns:d='http://www.develop.com/student'> 
    <d:id>3235329</d:id> 
    <d:name>Jeff Smith</d:name> 
    <d:language>JavaScript</d:language> 
    <d:rating>9.5</d:rating> 
</d:student> 

Salida:

$ node xml2jsTest.js 
{ '@': { 'xmlns:d': 'http://www.develop.com/student' }, 
    'd:id': '3235329', 
    'd:name': 'Jeff Smith', 
    'd:language': 'JavaScript', 
    'd:rating': '9.5' } 
Done 

puedo tener acceso al atributo 'nombre' mediante el uso de la notación result['d:name'] en lugar de result.name si no tuviera t el alias del espacio de nombres Supongo que mi pregunta es, ¿estoy haciendo esto de la manera correcta?

Tengo read que "Si un elemento tiene un alias de espacio de nombre, el alias y el elemento se concatenan usando" $ ". Por ejemplo, ns: elemento se convierte en ns $ elemento" Si hago esto, puedo leer el atributo como result.d$name. Si fuera por esta ruta, ¿cómo iba a hacerlo?

Respuesta

0

El documento que cita no tiene nada que ver con xml2js, pero puede obtener el mismo patrón si lo desea. Tendría que cambiar el código fuente de xml2js o repetir el proceso de renombrar todo después de cargarlo, las cuales no son buenas ideas (la primera significa que no podrá actualizar tan fácilmente, y ambas agregarán sobrecarga a su código) , por lo que probablemente debería apegarse a la sintaxis ['d: name']. La única desventaja es que agrega 3 caracteres a cada búsqueda, pero si su servidor usa gzip, no hará una diferencia en el mundo real.

Si realmente desea, esta función será cambiar el nombre de todo:

function colonToDollar(obj){ 
    var r={}; 
    for(var k in obj){ 
     r[k.replace(/:/g,'$')] = (typeof obj[k]==='object') ? colonToDollar(obj[k]) : obj[k]; 
    } 
    return r; 
} 
0

si utiliza nodo y xml2js utiliza result["ns:entry"] para referirse a una entrada específica

2

tuve un problema similar. La mayoría de mis etiquetas XML estaban en un solo espacio de nombres. Así que decidí eliminar todos los espacios de nombres de mi XML.

Es posible eliminar espacios de nombres al analizar XML agregando un tagNameProcessors a xml2js.

var parseString = require('xml2js').parseString; 
var stripNS = require('xml2js').processors.stripPrefix; 

parseString(xml_str, { tagNameProcessors: [stripNS] },function(err, result) {}); 

Esto ignorará técnicamente todo el espacio de nombres. Si tiene etiquetas XML de varios espacios de nombres, puede que esto no sea de gran utilidad.

Cuestiones relacionadas