Meteor: синтаксический анализ XML через xml2js возвращает фиктивный объект

#xml #meteor

#xml #meteor

Вопрос:

В настоящее время я пытаюсь проанализировать XML через meteor с помощью xml2js и вставить его в Mongodb. Я делаю это в server/fixtures.js с помощью следующего кода:

 Iati.insert({
    test: xml2js.parseString(Assets.getText('iati.xml'))
})
  

Xml2js, похоже, что-то преобразует, но результат кажется бессмысленным, а именно объект со следующими атрибутами:

 test: Object
ENTITIES: Object
attribList: Array[0]
attribName: ""
attribValue: ""
bufferCheckPosition: 65536
c: ""
cdata: ""
closed: false
closedRoot: false
column: 0
comment: ""
doctype: ""
entity: ""
error: null
line: 0
looseCase: "toUpperCase"
noscript: true
opt: Object
position: 0
procInstBody: ""
procInstName: ""
q: ""
sawRoot: false
script: ""
sgmlDecl: ""
startTagPosition: 9347
state: 0
strict: true
tag: null
tagName: ""
tags: Array[0]
textNode: ""
trackPosition: true
__proto__: Object
__proto__: Object
  

Как я должен изменить свой код, чтобы получить фактический XML в качестве выходных данных?Заранее благодарю вас

Ответ №1:

Согласно документации, вам нужно передать обратный вызов xml2js.parseString , чтобы получить фактическое значение:

 xml2js.parseString(Assets.getText('iati.xml'), function(err, res) {
  Iati.insert({
    test: res,
  });
});
  

Комментарии:

1. обратный вызов может потребоваться выполнить по оптоволокну. Потребуется что-то вроде Meteor.bindEnvironment или Meteor._runAsync или вручную Fibers(function() {...}).run() , поскольку вставка представляет собой код meteor

2. @hubertOG пример кода в ваших ответах дает точно такой же результат.

3. @Akshat что именно ты предлагаешь :)>

4. @Akshat: хорошая идея, я забыл, что мы на стороне сервера. Тем не менее, если бы проблема была с волокнами, это вызвало бы исключение, а не изменило результат, верно?

5. @Jaspermid: при ближайшем рассмотрении вы уверены, что полученные вами результаты не те, которые вы должны получать? Результат выглядит как определение узла XML.