使用Node JS从嵌套的XML中提取值
我在以XML为input的节点中编写REST服务,但是当我parsing它时,只显示第一级节点,嵌套的节点显示为对象。
我无法对要读取的XML元素进行硬编码,因为按照规范有可选元素,所以它必须是dynamic的。
我正在使用body-parser-xml
来parsingXML。
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的XMLinput是
<?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插件来调用这个服务http://localhost:3000/users
作为POST
和Content-Type
作为application/xml
。
请求你的帮助来解决这个问题。
你可能想要使用好的和不错的Util
包。 尝试这个:
const util = require('util'); // Parse your xml file console.log(util.inspect(parsedXml.classes, { depth: null, showHidden: false }));
希望这可以帮助。