2016-08-09 6 views
1

Node.jsの優れたlibxmljsライブラリを使用してドキュメントを解析すると、多くのネストされた要素が検出されたケースを見つけました。その中から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は、ここ

おかげ

+1

これは、各「レベル」を明示的に処理する静的なものではなく、再帰的な解決策を求めています。 – CBroe

答えて

0

は、いくつかの非稼働である(実際には簡単にこのライブラリを使用して行うことができる)XTDスキーマに対して検証されなければならない、という注意そのコードから

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; 

} 

、私はがでを動作するように思われる何かを構築することができます:this articleで見つけることができるコード最新の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; 
} 

私はこれが誰かを助けてくれることを望みます。

関連する問題