Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

144
Vistas
¿Cómo analizar y agregar al archivo XML un nuevo contenido?

Tengo un archivo XML codificado que necesito analizar y agregar contenido.

Este es el archivo:

 <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="PropertiesComponent"><![CDATA[{ "keyToString": { "RunOnceActivity.OpenProjectViewOnStart": "true" } }]]></component> </project>

Mi objetivo es convertirlo a:

 <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="PropertiesComponent"><![CDATA[{ "keyToString": { "RunOnceActivity.OpenProjectViewOnStart": "true", "test": 5 } }]]></component> </project>

Tengo el siguiente código JS para hacerlo:

 const path = require('path'); const fs = require('fs-extra'); const xml2js = require('xml2js'); const xmlFilePath = path.join(__dirname, './resource.xml'); const xmlFileDestPath = path.join(__dirname, './resource-new.xml'); (async () => { const xmlContent = await fs.readFile(xmlFilePath, 'utf-8').catch(() => ''); const parsedXml = await xml2js.parseStringPromise(xmlContent); const objectToAppend = parsedXml['project']['component'][0]['_']; const parsedObject = JSON.parse(objectToAppend); const parsedKeyToString = parsedObject['keyToString']; const newObject = { ...parsedKeyToString, test: 5 }; parsedXml['project']['component'][0]['_'] = JSON.stringify({ keyToString: newObject }); const builder = new xml2js.Builder({ xmldec: { version: '1.0', encoding: 'UTF-8' }, cdata: true, }); const workspaceXmlFileContent = builder.buildObject(parsedXml); await fs.writeFile(xmlFileDestPath, workspaceXmlFileContent); })();

Pero el archivo de salida es:

 <?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="PropertiesComponent">{"keyToString":{"RunOnceActivity.OpenProjectViewOnStart":"true","test":5}}</component> </project>

No es exactamente lo que quería. ¿Dónde está mi problema?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Probé su caso con xml2js y obtuve el mismo error.

Lo arreglé usando otro paquete xml2j-cdata Esta es mi nueva prueba y funciona de la manera que usted quiere. Espero poder ayudarte https://codesandbox.io/s/xml2js-cdata-test-hu39jw?file=/src/index.js https://www.npmjs.com/package/xml2js-cdata

about 4 years ago · Juan Pablo Isaza Denunciar

0

Podría resolverlo insertando un valor ficticio que obligue a la biblioteca a usar CDATA . Creé un valor ficticio que contiene un carácter ( < ) que activará el paquete para usar CDATA:

 const path = require('path'); const fs = require('fs-extra'); const xml2js = require('xml2js'); const xmlFilePath = path.join(__dirname, './resource.xml'); const xmlFileDestPath = path.join(__dirname, './resource-new.xml'); (async () => { const xmlContent = await fs.readFile(xmlFilePath, 'utf-8').catch(() => ''); const parsedXml = await xml2js.parseStringPromise(xmlContent); const objectToAppend = parsedXml['project']['component'][0]['_']; const parsedObject = JSON.parse(objectToAppend); const parsedKeyToString = parsedObject['keyToString']; const newObject = { ...parsedKeyToString, test: '<xxx>' }; parsedXml['project']['component'][0]['_'] = JSON.stringify({ keyToString: newObject }); const builder = new xml2js.Builder({ xmldec: { version: '1.0', encoding: 'UTF-8' }, cdata: true, }); const workspaceXmlFileContent = builder.buildObject(parsedXml); await fs.writeFile(xmlFileDestPath, workspaceXmlFileContent); })();
about 4 years ago · Juan Pablo Isaza Denunciar

0

Creo que es mejor intentarlo de esta manera:

 xml = `<?xml version="1.0" encoding="UTF-8"?> <project version="4"> <component name="PropertiesComponent"><![CDATA[{ "keyToString": { "RunOnceActivity.OpenProjectViewOnStart": "true" } }]]></component> </project> ` //parse the xml domdoc = new DOMParser().parseFromString(xml, "text/xml") //locate the right element result = domdoc.evaluate('//component', domdoc, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); //extract the CDATA let target = result.snapshotItem(0).childNodes[0].textContent //parse the content into JSON jobj = JSON.parse(target) //create a new entry newentry = { ...jobj.keyToString, "Test": 5}; //modify the JSON object jobj.keyToString=newentry //insert the modified entry into the JSON and stringify it result.snapshotItem(0).childNodes[0].textContent=JSON.stringify(jobj); console.log(domdoc.querySelector('project').outerHTML)

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda