1

Node.jsの優れたlibxmljsライブラリを使用してドキュメントを解析しているときに、ネストされた要素が多数見つかった場合に遭遇し、そこから JS オブジェクトを作成するだけで済みました。

コードは次のようになります。

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

libxmlJS を使用して XML 文字列 (またはその一部) からオブジェクトを作成し、そのようなことを行うためのより高速な組み込みの方法はありますか?

役立つ場合は、解析された XML を XTD スキーマに対して検証する必要があることに注意してください (これは、このライブラリを使用して非常に簡単に実行できます)。

ありがとう

4

1 に答える 1

0

この記事で見つけることができるいくつかの動作しないコードを次に示します。

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

これが誰かを助けたことを願っています。

于 2016-08-10T07:29:57.600 に答える