2016-08-09 2 views
1

При анализе документов с использованием отличной библиотеки libxmljs в Node.js я наткнулся на случай, когда было найдено много вложенных элементов, и единственное, что мне нужно было сделать, это создать из него объект JS.Как получить объект из XML-документа?

Вот что код выглядит следующим образом:

if (node.type() == 'element') { 
     switch(node.name()) { 
      case 'element1': { 
       myObject.element1 = {} 
       for (var i = 0; i < node.childNodes().length; i++) { 
        if(node.type() == 'element') { 
         switch(node.name()) { 
          case 'element2': { 
           myObject.element1.element2 = node.text() 
           ... 
}}}}}}}} 
/* didn't count the number of closing brackets, but you get the idea ^_^ */ 

Есть ли более быстрый или встроенный способ сделать такие вещи, создать объект из строки XML (или его части) с использованием libxmlJS?

Обратите внимание, что, если это поможет, разобранный XML должен быть проверен против XTD схемы (которая действительно может быть легко сделана с помощью этой библиотеки)

Благодарности

+1

Ну, это требует рекурсивного решения, а не статического, который явно обрабатывает каждый «уровень». – CBroe

ответ

0

Вот некоторые нерабочих код, который можно найти на this article:

function XML2jsobj(node) { 

    var data = {}; 

    // append a value 
    function Add(name, value) { 
     if (data[name]) { 
      if (data[name].constructor != Array) { 
       data[name] = [data[name]]; 
      } 
      data[name][data[name].length] = value; 
     } 
     else { 
      data[name] = value; 
     } 
    }; 

    // element attributes 
    var c, cn; 
    for (c = 0; cn = node.attributes[c]; c++) { 
     Add(cn.name, cn.value); 
    } 

    // child elements 
    for (c = 0; cn = node.childNodes[c]; c++) { 
     if (cn.nodeType == 1) { 
      if (cn.childNodes.length == 1 && cn.firstChild.nodeType == 3) { 
       // text value 
       Add(cn.nodeName, cn.firstChild.nodeValue); 
      } 
      else { 
       // sub-object 
       Add(cn.nodeName, XML2jsobj(cn)); 
      } 
     } 
    } 

    return data; 

} 

Из этого кода, я мог бы построить что-то, что , кажется, работает с последний выпуск libxmljs, вот он:

function XML2jsobj(node) { 
    var data = {}; 

    // append a value 
    function Add(name, value) { 
     if (data[name]) { 
      if (data[name].constructor != Array) { 
       data[name] = [data[name]]; 
      } 
      data[name][data[name].length] = value; 
     } 
     else { 
      data[name] = value; 
     } 
    }; 

    for (var c = 0; c < node.attrs().length; c++) { 
     var cn = node.attrs()[c]; 
     Add(cn.name, cn.value); 
    } 

    // child elements 
    for (var c = 0; c < node.childNodes().length; c++) { 
     var cn = node.childNodes()[c]; 
     if (cn.type() == 'element') { 
      if (cn.childNodes().length == 1 && cn.childNodes()[0].type() == 'text') { 
       // text value 
       Add(cn.name(), cn.childNodes()[0].text()); 
      } 
      else { 
       // sub-object 
       Add(cn.name(), XML2jsobj(cn)); 
      } 
     } 
    } 

    return data; 
} 

Надеюсь, это помогло бы кому-то.