我有一个读取和解析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,...),如果可能的话,如果效率更高。
答案 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>