2016-07-07 2 views
3

xml2jsを使用してXMLを結果からルートノードを削除し、私がobj JSONからXMLを作成しようとしていると、その私に、結果のルート要素を与え、私はfalseにexplicitRootvar parser = xml2js.Parser({explicitRoot:false}); を設定しようとしたが、それは削除されませんデフォルトのルートタグが、xml2js XML結果のNode.jsのは

<?xml version="1.0" encoding="utf-8"?> 
<VAST version="2.0">  
    <Ad id="72419"></Ad> 
</VAST> 

使用してちょうど私のorignalのXMLのルートタグを削除(<VSAT></VSAT>)

処理XML:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
<VAST version="2.0">  
<Ad id="72419"></Ad> 
</VAST> 
</root> 

完全なコード

/* 
NodeJS server 
*/ 
var http = require('http'); 
var xml2js = require('xml2js'); 
var fs = require('fs'); 
var util = require('util'); 
var json,PORT=2000; 

var server = http.createServer(function(request, response){ 
response.writeHead(200,{'Content-Type':'text/html'}); 
    try{ 
     var filedata = fs.readFileSync('vast_all.xml','ascii'); 

     var parser = xml2js.Parser({explicitRoot:true}); 
     parser.parseString(filedata.substring(0,filedata.length),function(err,result){ 
      result.new = 'test'; 
      json = JSON.stringify(result); 

      var builder = new xml2js.Builder({ 
       xmldec:{ 'version': '1.0', 'encoding': 'UTF-8' }, 
       cdata:true, 
      }); 

      var xml = builder.buildObject(json); 
      response.write(json); 
      /*console.log(util.inspect(builder, false, null));*/ 
     }); 

     response.end(); 
    } 
    catch(e){ 
     console.log(e); 
    } 
}); 


console.log("Server running at port "+PORT); 
try{ 
    server.listen(PORT); 
} 
catch(e){ 
    console.log(e); 
} 
+0

JSONとXMLの両方からサポートされていますが(ルート要素を持っているはずですが、あなたはしてみてはいけませんXMLに変換してください)。 JSONの例とその結果のXMLを質問に提供するのは賢明です。 – grochmal

+0

待って、あなたは 'xml2js.Parser()'ではなく 'xml2js.Builder()'を使ってJSON-> XMLを作っていますよね? – grochmal

+0

@ grochmal right。 – AngularLearner

答えて

1

これはコメントのために長すぎます。

xml2jsでJSONからXMLを作成する正しい方法は、xml2js.Builderです。たとえば、次のスニペットでJSONはXML文字列に変更され、その後、JSONに戻って解析された:

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

var data = { VAST: { '$': { version: '2.0' } 
        , Ad: { '$': { id: '72419' }, content: "yay" } } }; 
console.log("the JSON"); 
console.log(JSON.stringify(data)); 

// the JSON 
// {"VAST":{"$":{"version":"2.0"},"Ad":{"$":{"id":"72419"},"content":"yay"}}} 

var builder = new xml2js.Builder(); 
var xml = builder.buildObject(data); 
console.log("result from xml2js.builder"); 
console.log(xml); // this is a string 

// result from xml2js.builder 
// <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
// <VAST version="2.0"> 
// <Ad id="72419"> 
//  <content>yay</content> 
// </Ad> 
// </VAST> 

var parser = new xml2js.Parser(); 
parser.parseString(xml, function(err, result) { 
    console.log("result of parsing it back"); 
    console.log(JSON.stringify(result)); 
    console.log(result.VAST['Ad'][0]['$']['id']); // you can get the id back 
    }); 

// result of parsing it back 
// {"VAST":{"$":{"version":"2.0"},"Ad":[{"$":{"id":"72419"},"content":["yay"]}]}} 
// 72419 

パーサが複数のAdのタグを持つことができるので、余分な配列("Ad":[{"$")を追加(この後でノード内のものにきれいにアクセスすることができます)。あなたは、この追加した場合


今、:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; 
&lt;VAST version="2.0"&gt; 
    &lt;Ad id="72419"&gt; 
    &lt;content&gt;yay&lt;/content&gt; 
    &lt;/Ad&gt; 
&lt;/VAST&gt;</root> 

をしかし、それはまだです:そのスニペットのために

var badxml = builder.buildObject(xml); 
console.log(badxml); 

を、あなたは余分なroot要素でXMLを得るのですかそれは適切にエスケープされているので、あなたが得ているものとはまったく異なります。ビルダー例えばをインスタンス化する際に

+0

私はxml2jsでXMLを操作し、新しいノードを追加してからそれをXMLに変換して戻します(JSONから) – AngularLearner

0

はtrueにheadlessを設定します。:

let builder = new xml2js.Builder({headless: true});

これは私のために働きました。これは、削除:JSONは配列でない限り

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

しかし、これが唯一のバージョン0.4.3