0

私は非常に珍しい問題に遭遇しました。必要に応じて、全体像をよりよく理解するために、私の最後の投稿「 JavascriptのNodeListからサブNodeListを取得できません」を参照してください。

これでうまくいきますが、基本的に同じメソッドを使用して別のXML文字列を解析しようとすると、結果のNodeListにテキストノードが含まれなくなります。フォーマットされたXMLの代わりに、解析しようとしている文字列の一部をNodeListに投稿します。

<clients><client><code>1111</code><crm>2222</crm><company><name>FOO</name><enterprise>BAR</enterprise><cnpj>XXX</cnpj></company></client></clients>

これらはノードの実際の値ではありませんが、親ノードクライアントはこの構造に従います(ただし、かなり簡略化されています)。

そのため、テストの目的で、リストが適切に作成されているかどうかを確認するために、次のコードを使用することになりました。

function parseClientsXML(xmlString, filter){
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xmlString, "text/xml");
    var clients = xmlDoc.getElementsByTagName(filter);

    for(var i = 0; i < clients.length; i++){
        var client = clients[i].childNodes;
        for (var j = 0; j < client.length; j++){
            var node = client[j];
            $('#div_clients').append("Node index: " + i + " - Type: " + node.nodeType + " - Name: " + node.nodeName + "<br>");
        }
    }

関数の呼び出し:

parseXML(theString, "clients");

私が期待した結果は次のようなものでした。

Node index: 0 - Type: 1 - Name: client
Node index: 1 - Type: 1 - Name: code
Node index: 2 - Type: 3 - Name: #text
Node index: 3 - Type: 1 - Name: crm
Node index: 4 - Type: 3 - Name: #text

等々。他の投稿のXMLから「theString」として解析された文字列を使用すると、正常に機能します。しかし、この投稿の文字列の出力は次のようになります。

Node index: 0 - Type: 1 - Name: client
Node index: 1 - Type: 1 - Name: code
Node index: 2 - Type: 1 - Name: crm
Node index: 3 - Type: 1 - Name: company
Node index: 4 - Type: 1 - Name: name
...

私は一日中これに取り組んできましたが、解決策を見つけることができませんでした。入力文字列は、上記で投稿したものとまったく同じです(正確ではありませんが、近いです)。何か案は?

4

1 に答える 1

2

約束通りの問題の解決策。

function parseClientsXML(xmlString, filter) {
    var parser = new DOMParser();
    var xmlDoc = parser.parseFromString(xmlString, "text/xml");

    (function output(node, filter) {
        var child;
        var children = node.childNodes.length;

        if (filter === "") {
            $('#div_clients').append(node.nodeType + " : " + node.nodeName + "<br>");
        } else {
            filter = node.nodeName === filter ? "" : filter;
        }

        for (child = 0; child < children; child += 1) {
            output(node.childNodes[child], filter);
        }
    }(xmlDoc, filter));
}
于 2013-01-26T17:27:47.000 に答える