3

XMLを読み取って解析するjsスクリプトがあります。XMLHttpRequestリクエスト(XMLを返すphpスクリプトと接触する)からXMLを取得します。スクリプトは、最初のparentNodeの下に2つ以上のノードを受け取ることになっています。必要な2つのノードには明確に定義された名前があり、他のノードには任意の名前を付けることができます。phpからの出力は次のようになります。

<?xml version='1.0'?>
<things>
    <carpet>
        <id>1</id>
        <name>1</name>
        <desc>1.5</desc>
    </carpet>
    <carpet>
        <id>2</id>
        <name>2</name>
        <height>unknown</height>
    </carpet>
</things>

ここでは、すべてのカーペットに7つのノードがあります。

しかしそれはまたかもしれません:

<?xml version='1.0'?>
<things>
    <carpet>
        <id>1</id>
        <name>1</name>
        <desc>1.5</desc>
    </carpet>
    <carpet><id>2</id><name>2</name><height>unknown</height></carpet>
</things>

ここで、最初のカーペットには7つのノードがあり、2番目のカーペットには3つのノードがあります。私のjavascriptコードは、両方をまったく同じようにすばやくクリーンに処理する必要があります。可能であれば、各タグ間のすべてのテキストノードを削除したいと思います。したがって、上記のようなコードは常に次のように扱われます。

<?xml version='1.0'?>
    <things><carpet><id>1</id><name>1</name><desc>1.5</desc></carpet><carpet><id>2</id><name>2</name><height>unknown</height></carpet></things>

それは迅速かつ効率的な方法で可能ですか?可能であれば、より効率的に、get関数(getElementsByTagName()、getElementById、...)を使用しないようにします。

4

2 に答える 2

6

DOMをウォークして、空であると見なすノード(空白のみを含む)を削除するのは非常に簡単です。

これはテストされていません(テストおよび修正済み、ライブコピーはこちら)が、次のようになります(明らかに、これらのマジックナンバーを記号に置き換えてください)。

var reBlank = /^\s*$/;
function walk(node) {
    var child, next;
    switch (node.nodeType) {
        case 3: // Text node
            if (reBlank.test(node.nodeValue)) {
                node.parentNode.removeChild(node);
            }
            break;
        case 1: // Element node
        case 9: // Document node
            child = node.firstChild;
            while (child) {
                next = child.nextSibling;
                walk(child);
                child = next;
            }
            break;
    }
}
walk(xmlDoc); // Where xmlDoc is your XML document instance

ここでの「空白」の定義は、JavaScriptインタープリターによる\s(空白の)RegExpクラスの理解によると空白のみを持つものです。一部の実装で\sは、包括的でないという問題があることに注意してください(ASCII範囲外のいくつかのUnicode「空白」文字が一致しないなど)。そのため、必ずサンプルデータでテストしてください。

于 2011-04-28T10:34:12.467 に答える
0

xml非常に大雑把な文字列置換を試してみます。これを:という変数に格納すると仮定します。

var rex = /(\<(\/)?[A-Za-z0-9]+\>)(\s)+/gi;
var a = xml.replace( rex, "$1" );

これが私がまとめた完全なテストです:

<html><head></head>

<body>
<script type="text/javascript">
var xml = "<?xml version='1.0'?>\n" + 
"<things>\n" +
"    <carpet>\n" +
"        <id>1</id>\n" +
"        <name>1</name>\n" +
"        <desc>1.5</desc>\n" +
"    </carpet>\n" +
"    <carpet>\n" +
"        <id>2</id>\n" +
"        <name>2</name>\n" +
"        <height>unknown</height>\n" +
"    </carpet>\n" +
"</things>";

var rex = /(\<(\/)?[A-Za-z0-9]+\>)(\s)+/gi;
var a = xml.replace( rex, "$1" );
alert( a );

</script>


</body></html>
于 2011-04-28T10:31:57.217 に答える