Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

142
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!