0

In NodeJS I want to find "This text must change" in json. This is currently my code:

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

fs.readFile('content.xml', 'utf-8', function (err, data){
    if(err) console.log(err);

    parseString(data, function(err, result){
        if(err) console.log(err);

        var json = result;
        console.log(json);

        var needle = 'This text must change';

        for (var i = 0; i < json.length; i++){
          if (json[i] == needle){
            console.log("Found it");
          }
        }

        var builder = new xml2js.Builder();
        var xml = builder.buildObject(json);

        fs.writeFile('edited-test.xml', xml, function(err, data){
            if (err) console.log(err);

            console.log("successfully written our update xml to file");
        })

    });
});       

This is my console.log(json):

{ 'office:document-content': 
   { '$': 
      { 'xmlns:office': 'urn:oasis:names:tc:opendocument:xmlns:office:1.0',
        'xmlns:style': 'urn:oasis:names:tc:opendocument:xmlns:style:1.0',
        'xmlns:text': 'urn:oasis:names:tc:opendocument:xmlns:text:1.0',
        'xmlns:table': 'urn:oasis:names:tc:opendocument:xmlns:table:1.0',
        'xmlns:draw': 'urn:oasis:names:tc:opendocument:xmlns:drawing:1.0',
        'xmlns:fo': 'urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0',
        'xmlns:xlink': 'http://www.w3.org/1999/xlink',
        'xmlns:dc': 'http://purl.org/dc/elements/1.1/',
        'xmlns:meta': 'urn:oasis:names:tc:opendocument:xmlns:meta:1.0',
        'xmlns:number': 'urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0',
        'xmlns:svg': 'urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0',
        'xmlns:chart': 'urn:oasis:names:tc:opendocument:xmlns:chart:1.0',
        'xmlns:dr3d': 'urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0',
        'xmlns:math': 'http://www.w3.org/1998/Math/MathML',
        'xmlns:form': 'urn:oasis:names:tc:opendocument:xmlns:form:1.0',
        'xmlns:script': 'urn:oasis:names:tc:opendocument:xmlns:script:1.0',
        'xmlns:ooo': 'http://openoffice.org/2004/office',
        'xmlns:ooow': 'http://openoffice.org/2004/writer',
        'xmlns:oooc': 'http://openoffice.org/2004/calc',
        'xmlns:dom': 'http://www.w3.org/2001/xml-events',
        'xmlns:xforms': 'http://www.w3.org/2002/xforms',
        'xmlns:xsd': 'http://www.w3.org/2001/XMLSchema',
        'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance',
        'xmlns:rpt': 'http://openoffice.org/2005/report',
        'xmlns:of': 'urn:oasis:names:tc:opendocument:xmlns:of:1.2',
        'xmlns:xhtml': 'http://www.w3.org/1999/xhtml',
        'xmlns:grddl': 'http://www.w3.org/2003/g/data-view#',
        'xmlns:tableooo': 'http://openoffice.org/2009/table',
        'xmlns:textooo': 'http://openoffice.org/2013/office',
        'xmlns:field': 'urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0',
        'office:version': '1.2' },
     'office:scripts': [ '' ],
     'office:font-face-decls': [ [Object] ],
     'office:automatic-styles': [ '' ],
     'office:body': [ [Object] ] } }

The text is in office:body, but I don't know how to parse it through. Any help would be appreciate

EDIT: This is my content.xml:

<office:document-content office:version="1.2"><office:scripts/><office:font-face-decls><style:font-face style:name="Lucida Sans1" svg:font-family="'Lucida Sans'" style:font-family-generic="swiss"/><style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/><style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/><style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="SimSun" svg:font-family="SimSun" style:font-family-generic="system" style:font-pitch="variable"/></office:font-face-decls><office:automatic-styles/><office:body><office:text><text:sequence-decls><text:sequence-decl text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0" text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls><text:p text:style-name="Standard">This text must change</text:p></office:text></office:body></office:document-content>

And this should be my edited-test.xml:

<office:document-content office:version="1.2"><office:scripts/><office:font-face-decls><style:font-face style:name="Lucida Sans1" svg:font-family="'Lucida Sans'" style:font-family-generic="swiss"/><style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/><style:font-face style:name="Arial" svg:font-family="Arial" style:font-family-generic="swiss" style:font-pitch="variable"/><style:font-face style:name="Lucida Sans" svg:font-family="'Lucida Sans'" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="Microsoft YaHei" svg:font-family="'Microsoft YaHei'" style:font-family-generic="system" style:font-pitch="variable"/><style:font-face style:name="SimSun" svg:font-family="SimSun" style:font-family-generic="system" style:font-pitch="variable"/></office:font-face-decls><office:automatic-styles/><office:body><office:text><text:sequence-decls><text:sequence-decl text:display-outline-level="0" text:name="Illustration"/><text:sequence-decl text:display-outline-level="0" text:name="Table"/><text:sequence-decl text:display-outline-level="0" text:name="Text"/><text:sequence-decl text:display-outline-level="0" text:name="Drawing"/></text:sequence-decls><text:p text:style-name="Standard">This is already changed text !</text:p></office:text></office:body></office:document-content>
1
  • What is your desired result? Commented May 2, 2017 at 14:19

1 Answer 1

2

Could you not simply do something like:

fs.readFile('content.xml', 'utf-8', function (err, data){
if(err) console.log(err);

parseString(data, function(err, result){
    if(err) console.log(err);

    var json = result;
    console.log(json);

    var needle = 'This text must change';

    // Convert the result into a string, replace all instances of
    // needle with some text, then parse the json string back into
    // an object
    json = JSON.parse(JSON.stringify(result).replace(needle, SOME_REPLACEMENT_TEXT_HERE));

    ...

});  
Sign up to request clarification or add additional context in comments.

2 Comments

Omg, yes that actually worked ! :D Thank you. Just change to: JSON.stringify
Thanks for pointing out that mistake, glad I could be of help! Those 2 methods are extremely useful when it comes to objects

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.