2016-04-21 82 views
1

我正在以XML作爲輸入的節點中編寫REST服務,但是當我解析它時,只顯示第一級節點,嵌套的節點顯示爲對象。使用節點JS從嵌套XML中提取值

我無法對要讀取的XML元素進行硬編碼,因爲根據規範有可選元素,所以它必須是動態的。我使用body-parser-xml解析XML。

var express = require('express'), 
    bodyParser = require('body-parser'); 

require('body-parser-xml')(bodyParser); 

//var xmlparser = require('express-xml-bodyparser'); 

var app = express(); 

app.use(bodyParser.xml({ 
    limit: '1MB', // Reject payload bigger than 1 MB 
    xmlParseOptions: { 
    normalize: true,  // Trim whitespace inside text nodes 
    normalizeTags: true, // Transform tags to lowercase 
    explicitArray: false, // Only put nodes in array if >1 
    preserveChildrenOrder: true 
    } 
})); 

// app.use(xmlparser()); 

app.post('/users', function(req, res, body) { 
    // Any request with an XML payload will be parsed 
    // and a JavaScript object produced on req.body 
    // corresponding to the request payload. 
    console.log(req.body); 
    var parsedXml = req.body; 
    console.log(parsedXml.classes); 
    res.status(200).end(); 
}); 

var http = require('http'); 
http.createServer(app).listen(3000); 

我對REST XML輸入

<?xml version="1.0" encoding="UTF-8"?> 
<Schools> 
<School> 
    <Name>Some Name</Name> 
    <City>Some City</City> 
    <Classes> 
     <Class> 
      <Name>Class 1</Name> 
      <OnRoll>20</OnRoll> 
      <Students> 
       <Student> 
        <Name>Student 1</Name> 
        <Age>10</Age> 
       </Student> 
       <Student> 
        <Name>Student 2</Name> 
        <Age>11</Age> 
       </Student> 
      </Students> 
     </Class> 
     <Class> 
      <Name>Class 2</Name> 
      <OnRoll>30</OnRoll> 
      <Students> 
       <Student> 
        <Name>Student 21</Name> 
        <Age>12</Age> 
       </Student> 
       <Student> 
        <Name>Student 22</Name> 
        <Age>13</Age> 
       </Student> 
      </Students> 
     </Class> 
    </Classes> 
    <Labs> 
     <Lab> 
      <Name>Science Lab 1</Name> 
      <Subject>Physics</Subject> 
     </Lab> 
     <Lab> 
      <Name>Science Lab 2</Name> 
      <Subject>Chemistry</Subject> 
     </Lab> 
    </Labs> 
    </School> 
</Schools> 

,輸出是

D:\Tryouts\myapp>node xmlParser.js 
{ schools: 
    { school: 
     { name: 'Some Name', 
     city: 'Some City', 
     classes: [Object], 
     labs: [Object] } } } 
undefined 

基本上我在尋找的東西這將自動讀取嵌套的XML並顯示它。

我使用Chrome的插件REST與MethodPOSTContent-Typeapplication/xml來調用這個服務http://localhost:3000/users

請求您的幫助來解決此問題。

回答

2

你可能想要使用良好和漂亮的Util包。試試這個:

const util = require('util'); 
// Parse your xml file 
console.log(util.inspect(parsedXml.classes, { depth: null, showHidden: false })); 

希望這會有所幫助。

+0

一致認爲,這看起來像一個控制檯的默認問題,而不是FML解析的問題。 – Paul

+0

parsedXml.classes仍然給我未定義,但是我能通過傳遞parsedXml得到完整的深度。現在下一部分是當我嘗試讀取/打印它失敗的單個元素時,因此我使用JSON.parse將sting解析爲JSON對象並獲取單個元素。它在JSON.parse方法中拋出錯誤。 – rtv

+0

你如何嘗試訪問每個元素...你可以把這段代碼...你真正將xml字符串轉換爲json對象的位置? –