使用javascript中的xPath使用默认命名空间解析XML

dug*_*tov 3 javascript xml xpath namespaces

我需要创建一个XML xPath解析器.所有解析都必须在客户端进行(使用javascript).我创建了一个执行此操作的javascript,在默认命名空间发挥作用之前,所有内容都可以正常运行.我根本无法查询具有默认命名空间的XML.

我在小提琴上创建了一个示例代码.在xmlString中是从服务器接收的XML字符串.在xPathString中,对收到的XML进行查询.

以下是一些场景:

  1. http://jsfiddle.net/BF34q/1/ - 没有命名空间 - 一切正常
  2. http://jsfiddle.net/BF34q/2/ - 添加了ns命名空间.element有ns:前缀.xPath使用此前缀 - 确定
  3. http://jsfiddle.net/BF34q/3/ - 使用默认命名空间 - 不确定如何配置xPathString.

请注意,其他人将使用此解析器,所以我真的想避免像这样的解决方案

var xPathString = "//*[local-name()='book']";
Run Code Online (Sandbox Code Playgroud)

并使他们能够使用简单的xPath表达式解析它.我想知道是否可以在javascript中指定默认名称空间前缀?

注意:小提琴上提供的示例在IE中不起作用.

dug*_*tov 8

我认为有三种方法可以做到这一点:

  1. 使用//*[local-name()='book']语法访问节点
  2. 将XML转换为字符串,使用RegExp删除默认命名空间,将其转换回XML
  3. 对于事先知道名称空间的XML文件,您可以创建自己的名称空间解析程序,这将允许您使用自己的前缀作为默认名称空间.

这可以这样实现:

function nsResolver(prefix) {
    switch (prefix) {
        case 'xhtml':
            return 'http://www.w3.org/1999/xhtml';
        case 'mathml':
            return 'http://www.w3.org/1998/Math/MathML';
        default:
            return 'http://example.com/domain';
    }
}
xml.evaluate('//myPrefix:book', xml, nsResolver, XPathResult.ANY_TYPE, null);
Run Code Online (Sandbox Code Playgroud)