DOM导航:消除文本节点

时间:2011-04-28 10:18:21

标签: javascript xmldom

我有一个读取和解析XML的js脚本。 它从XMLHttpRequest请求获取XML(它与返回XML的php脚本联系)。 该脚本应该在第一个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,...),如果可能的话,如果效率更高。

2 个答案:

答案 0 :(得分:6)

走DOM并删除您认为为空的节点(仅包含空格)非常简单。

这是未经测试 (已测试并修复,live copy here),但它看起来像这样(显然用符号替换那些魔术数字):

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“空白”字符不匹配等),因此请务必使用示例数据进行测试。

答案 1 :(得分: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>
相关问题