2016-07-07 73 views
3

我試圖創建從JSON OBJ和其給我的結果根元素的XML生成的XML刪除根節點,我嘗試設置explicitRootvar parser = xml2js.Parser({explicitRoot:false}); 假,但它不會刪除默認的根標籤,但只刪除我的一部開拓創新的XML根標籤使用xml2jsNode.js的使用xml2js

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

生成的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應該有一個根元素(除非JSON是一個數組,它是,但你不應該嘗試將其轉換爲XML)。在問題中提供示例JSON和結果XML是明智的,只是爲了更好地說明它。 – grochmal

+0

等一下,你使用'xml2js.Builder()'而不是'xml2js.Parser()'來製作JSON-> XML,對吧? – grochmal

+0

@grochmal的權利。 – AngularLearner

回答

1

這是一個評論太長。

從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標籤(這稍後可以使用乾淨的方式訪問節點中的東西)。現在


,如果添加此:

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

爲此段的結束,那麼你就得到一個XML與額外root元素:

<?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> 

,但它仍然是與你所得到的完全不同,因爲它正確地逃脫了。

+0

我使用xml2js操作XML並添加新節點,然後將其轉換回XML(來自JSON) – AngularLearner

0

設置headless到真正的實例生成器例如爲:

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

這爲我工作的時候。它去掉了:

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

但這只是從0.4.3版本支持