2016-04-21 6 views
1

Я пишу службу REST в узле, которая принимает XML как входную информацию, однако при ее анализе отображаются только узлы 1-го уровня, вложенные отображаются в виде объектов.Извлечь значения из вложенных XML с помощью Node JS

Я не могу жестко закодировать 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); 

Мой вход XML для REST является

<?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 с Method как POST и Content-Type как application/xml.

С вашей помощью для решения проблемы.

ответ

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 для анализа жала как объекта JSON и получения отдельных элементов. Это ошибка в методе JSON.parse. – rtv

+0

Как вы пытаетесь получить доступ к каждому элементу ... можете ли вы поместить этот фрагмент кода ... где вы фактически преобразуете строку xml в объект json? –

Смежные вопросы