2016-08-09 56 views
1

Beim Analysieren von Dokumenten mit der ausgezeichneten Bibliothek libxmljs in Node.js stieß ich auf einen Fall, in dem viele verschachtelte Elemente gefunden wurden, und das einzige, was ich tun musste, war ein JS-Objekt daraus zu erstellen.Wie bekomme ich ein Objekt aus einem XML-Dokument?

Hier ist, was der Code wie folgt aussieht:

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 ^_^ */ 

Gibt es einen schnelleren oder integrierte Möglichkeit, solche Dinge zu tun, um ein Objekt aus einer XML-Zeichenfolge erstellen (oder ein Teil davon) mit libxmlJS?

Beachten Sie, dass, wenn es die analysierte XML hilft, muss vor einem XTD Schema validiert werden (das kann wirklich leicht mit dieser Bibliothek durchgeführt werden)

Dank

+1

Nun, das bittet eher um eine rekursive Lösung als um eine statische, die jede "Ebene" explizit behandelt. – CBroe

Antwort

0

Hier einige nicht arbeit Code, der auf this article gefunden werden kann:

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; 

} 

Von diesem Code, kann ich etwas bauen, die scheint zu funktionieren mit die neueste Version von libxmljs, hier ist es:

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; 
} 

Ich hoffe, dass dies jemand geholfen haben wird.