【问题标题】:Case-insensitive XPath node matching in JavaScriptJavaScript 中不区分大小写的 XPath 节点匹配
【发布时间】: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


【解决方案1】:

我对 JavaScript 世界中的 XPath 了解不多,但仅查看您的 XPath 至少有两件事需要修复:

  1. 使用translate() instead of transform()
  2. 使用name()而不是node()按元素名称匹配

尝试使用这个 XPath:

//*[translate(name(), 'ABCD...', 'abcd...') = 'extensions']

【讨论】:

  • 这很完美!我猜我只是在 XPath 上很烂。在这里,我认为浏览器不支持 XPath 过滤器。在 Safari、Firefox 和 Chrome 中测试。希望它能在 IE 中运行...
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多