【发布时间】:2014-07-01 19:06:42
【问题描述】:
我正在尝试使用 JavaScript 来解析 VMAP file。我目前的工作代码看起来像这样:
function equalsIgnoreCase(a, b) {
return a.toLowerCase() == b.toLowerCase();
}
for(var i = 0, l = xml.childNodes.length; i < l; i++) {
var node = xml.childNodes[i];
if( equalsIgnoreCase( node.tagName, 'adbreak' ) ) {
// Do stuff
} else {
// Unexpected tag
}
}
这种方法的问题在于,我要检查的标签比 AdBreak(自定义扩展)要多很多,而且编写大量的 if/else 瀑布非常多余形式:
if( equalsIgnoreCase( node.tagName, 'adbreak' ) ) {
// ...
} else if( equalsIgnoreCase( node.tagName, 'otherTag1' ) {
// ...
} else if( equalsIgnoreCase( node.tagname, 'otherTag2' ) {
// ...
} else if....
理想情况下,我希望使用 XPath 来解决我的所有问题。然后我的所有代码都可以压缩成一行:
var contentURI = XpathWrapper( xml, 'Extensions/MyExtension/Content' ).iterateNext().text();
var splashScreen = XpathWrapper( xml, 'Extensions/MyExtension/Splash' ).iterateNext().text();
// ...
问题在于 Xpath 区分大小写。我在网上找到了一些建议,说您可以使用 transform 方法使 Xpath 不区分大小写,但是这在实践中不起作用:
// This fails:
XpathWrapper( xml, "*[transform(node(), 'ABCD...', 'abcd...') = 'extensions']" )
我确实找到了一条有用的建议,但它远没有用:
// This works:
XpathWrapper( xml, "Extensions | EXTENSIONS | extensions | EXTensions | ..." );
有什么方法可以使这项工作(不必键入每个字符串 800 种方式)?请注意,我不需要维护原始 XML 的结构,因此如果有一种方法可以在执行任何 Xpath 搜索之前将整个文档简单地转换为小写,这是可以接受的。
【问题讨论】:
-
我无法谈论 JS 中的 XPath 解决方案,但第一个可以通过标签查找表轻松处理 => 函数。
-
transform 不是 XPath 函数,你要使用的是
translate(node(), 'ABCD...', 'abcd...')
标签: javascript xml xpath