我需要创建一个 XML xPath 解析器。所有解析都必须在客户端进行(使用 JavaScript)。我创建了一个 javascript 来执行此操作,在默认名称空间发挥作用之前,一切看起来都正常。我根本无法查询具有默认命名空间的 XML。
我在小提琴上创建了一个示例代码。 xmlString 是从服务器接收到的 XML 字符串。在 xPathString 中,对接收到的 XML 进行查询。
以下是一些场景:
-
http://jsfiddle.net/BF34q/1/ http://jsfiddle.net/BF34q/1/- 没有命名空间 - 一切正常
-
http://jsfiddle.net/BF34q/2/ http://jsfiddle.net/BF34q/2/- 添加了 ns 命名空间。元素有 ns: 前缀。 xPath 使用此前缀 - 好的
-
http://jsfiddle.net/BF34q/3/ http://jsfiddle.net/BF34q/3/- 使用默认命名空间 - 不确定如何配置 xPathString。
请注意,其他人会使用这个解析器,所以我真的很想避免像这样的解决方案
var xPathString = "//*[local-name()='book']";
并使他们能够使用简单的 xPath 表达式来解析它。我想知道是否可以在 javascript 中分配默认名称空间前缀?
注意:fiddle 上提供的示例在 IE 中不起作用。
我认为有以下三种方法可以做到这一点:
- Use
//*[local-name()='book']
访问节点的语法
-
将 XML 转换为字符串 http://joncom.be/code/javascript-xml-conversion/,使用 RegExp 删除默认命名空间,将其转换回 XML http://joncom.be/code/javascript-xml-conversion/
- 对于您预先知道命名空间的 XML 文件,您可以创建您的自己的命名空间解析器 https://developer.mozilla.org/en/Introduction_to_using_XPath_in_JavaScript#Implementing_a_Default_Namespace_Resolver,这将允许您使用自己的前缀作为默认名称空间。
这可以这样实现:
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)