2016-04-21 47 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对象的位置? –