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

时间:2011-07-20 11:58:41

标签: 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。
  4. 请注意,其他人会使用此解析器,所以我真的想避免像

    这样的解决方案
    var xPathString = "//*[local-name()='book']";
    

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

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

2 个答案:

答案 0 :(得分:8)

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

  1. 使用//*[local-name()='book']语法访问节点
  2. Convert XML to string,使用RegExp convert it back to XML
  3. 删除默认命名空间
  4. 对于事先知道命名空间的XML文件,您可以创建own namespace resolver,这将允许您使用自己的前缀作为默认命名空间。
  5. 这可以这样实现:

    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);
    

答案 1 :(得分:0)

我的印象是你对XPath处理的理解与实现不匹配 - 除非你正在处理的实现与我熟悉的实现有很大不同。

通常,XPath处理器必须注册名称空间并将前缀映射到它们,以便成功评估表达式。所以前缀可以是任何东西 - 唯一重要的是它们被映射到的东西。请参阅this answer by a known expert以获取更多信息。