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

2024-05-21

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

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

以下是一些场景:

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

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

var xPathString = "//*[local-name()='book']";

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

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


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

  1. Use //*[local-name()='book']访问节点的语法
  2. 将 XML 转换为字符串 http://joncom.be/code/javascript-xml-conversion/,使用 RegExp 删除默认命名空间,将其转换回 XML http://joncom.be/code/javascript-xml-conversion/
  3. 对于您预先知道命名空间的 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(使用前将#替换为@)

在 javascript 中使用 xPath 解析具有默认命名空间的 XML 的相关文章

随机推荐

  • Spyder 无法启动:spyder:找不到命令

    我已经安装了spyderpip3 install spyder在苹果电脑上 但是 当我无法从 bash 启动它时 它会显示spyder command not found 我已按照其说明进行操作Github页面 https github c
  • 为什么表达式 a = a + b - ( b = a ) 在 C++ 中给出序列点警告?

    以下是测试代码 int main int a 3 int b 4 a a b b a cout lt lt a lt lt a lt lt lt lt b lt lt b lt lt n return 0 编译此命令会出现以下警告 gt g
  • 使用条件语句生成新变量

    给定以下数据集和命令 sysuse auto clear generate x replace x 5 if price 4099 replace x 5 if price 4749 我想生成一个新变量x等于5 if price属于值列表
  • 重复命名捕获组

    我有一个带有如下字段的字符串 id ID 120 1 ID 141 5 ID 92 5 N A 我只想捕获命名捕获组的 ID 即没有 N A 或其他可能潜入的项目 我认为这可能有效 但没有运气 bid
  • 按英国邮政编码向 Google 地图添加多个图钉

    今天我的谷歌搜索技巧让我失望了 我可以使用英国邮政编码向 Google 地图添加一个图钉 但我找不到如何从 100 个邮政编码的选择中添加多个引脚 感谢所有帮助 您可能想查看以下示例 我相信您应该明白以下内容
  • 多个对象以某种方式相互干扰[原始版本]

    我有一个神经网络 NN 当应用于单个数据集时 它可以完美地工作 但是 如果我想在一组数据上运行神经网络 然后创建一个新的神经网络实例以在不同的数据集 甚至再次同一组数据 上运行 那么新实例将产生完全错误的预测 例如 对 XOR 模式进行训练
  • 调试VS 2005提示“操作不支持”

    我一直在调试 VS 2005 并将 启动外部程序 设置为 C Program Files Microsoft Visual Studio 10 0 Common7 IDE devenv exe 但按 F5 后出现此错误 尝试运行项目时出错
  • 如何让JComboBox中的内容居中显示?

    目前我有这个JComboBox 我怎样才能将其中的内容居中 String strs new String 15158133110 15158133124 15158133458 JComboBox com new JComboBox str
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • Android Jasper 报告

    Jasper Reporting 可以集成到 Android 应用程序中吗 我正在尝试从 jrxml 文件生成 PDF CSV 文本和 XLS 报告 但是 我没有看到 Android SDK 支持 net sf jasperreports
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这
  • Bootstrap 3 / 显示模式不适用于 javascript 方式

    我用Modal http getbootstrap com javascript modalsBootstrap 3 0 的功能 我有这个代码 a href myNestedContent Open the modal containing
  • 如何为不同操作系统/Python 版本编译 Python C/C++ 扩展?

    我注意到一些成熟的Python库已经为大多数架构 Win32 Win amd64 MacOS 和Python版本提供了预编译版本 针对不同环境交叉编译扩展的标准方法是什么 葡萄酒 虚拟机 众包 我们使用虚拟机和Hudson http hud
  • 在 VS2008 的 XAML 编辑器中禁用 Intellisense?

    有没有办法在 Visual Studio 2008 的 XAML 编辑器中禁用 Intellisense 打字时通常会消耗很大的性能 有时我会等待十秒或更长时间 直到列表自动弹出 似乎在 选项 gt 文本编辑器 gt XAML 中 Inte
  • 查询联系人 - 有时返回空游标

    我正在尝试查询联系人的显示名称 Override public void onActivityResult int requestCode int resultCode Intent data switch requestCode case
  • Swing:创建可拖动组件...?

    我在网上搜索了可拖动 Swing 组件的示例 但我发现示例不完整或不起作用 我需要的是一个摇摆组件那可以是dragged通过鼠标 在另一个组件内 被拖拽的时候 应该已经 改变它的位置 而不仅仅是 跳 到目的地 我很欣赏无需非标准 API 即
  • 如何检查设备上是否安装了文本转语音 (TTS) 的特定语言数据?

    我正在创建一个使用文本转语音的应用程序 我希望用户能够离线使用它 因此我检查设备上是否安装了 TTS 数据 以下是执行此操作的代码 Check tts data is installed Intent checkTTSIntent new
  • RichFaces 应用程序,我应该使用 rich:dataTable 还是 jQGrid,优缺点吗?

    继从here https stackoverflow com questions 3899649 ok to wrap jsf components generated html with own divs using jquery aft
  • 如何调试 Gulp 任务?

    如何调试我的中定义的 gulp 任务gulpfile js使用诸如 Google Chrome 调试器之类的调试器逐行单步执行任务的代码 对于 Node js 6 3 版本 您可以使用 inspect flag https nodejs o
  • 在 javascript 中使用 xPath 解析具有默认命名空间的 XML

    我需要创建一个 XML xPath 解析器 所有解析都必须在客户端进行 使用 JavaScript 我创建了一个 javascript 来执行此操作 在默认名称空间发挥作用之前 一切看起来都正常 我根本无法查询具有默认命名空间的 XML 我