我试图使用JavaScript来解析VMAP文件。我目前的工作代码看起来像这样:
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
}
}
这种方法的问题是,我有一个lot更多的标签,我正在检查的不仅仅是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搜索之前有一种方法可以简单地将整个文档转换为小写,这是可以接受的。
我不太了解JavaScript世界中的XPath,但仅看XPath,至少有两件事需要修复:
- 用
translate()
代替transform()
- 使用
name()
代替node()
来匹配元素名
尝试使用这个XPath:
//*[translate(name(), 'ABCD...', 'abcd...') = 'extensions']