使用 XPath 从具有不必要名称空间的文档中提取 XOM 元素

2023-12-14

我正在尝试使用 XOM 解析外部系统返回的一些 HTML。 HTML 看起来像这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<body>
  <div>
    Help I am trapped in a fortune cookie factory
  </div>
</body>
</html>

(实际上它更加混乱,但它有这个 DOCTYPE 声明以及这些命名空间和语言声明,并且上面的 HTML 表现出与真正的 HTML 相同的问题。)

我想做的是提取内容<div>,但是命名空间声明似乎使 XPath 感到困惑。如果我(从文件中手动)删除名称空间声明,以下代码会找到<div>, 没问题:

Document document = ...
Nodes divs = document.query("//div");

但是有了命名空间,返回的Nodes大小为 0。

好吧,如果我以编程方式剥离命名空间怎么样?

Element rootElement = document.getRootElement();
rootElement.removeNamespaceDeclaration(rootElement.getNamespacePrefix());

...看起来应该有效,但什么也没做。来自javadoc:

此方法仅删除添加的附加命名空间addNamespaceDeclaration.

好吧,我想,我将为查询提供名称空间:

XPathContext context = 
    XPathContext.makeNamespaceContext(document.getRootElement());
Nodes divs = document.query("//div", context);

大小仍然为零。

手动构建命名空间上下文怎么样?

XPathContext context = context = new XPathContext(
     rootElement.getNamespacePrefix(), rootElement.getNamespaceURI());
Nodes divs = document.query("//div", context);

The XPathContext构造函数爆炸:

nu.xom.NamespaceConflictException: 
    XPath expressions do not use the default namespace

所以,我正在寻找:

  1. 一种使该查询工作的方法,或者
  2. 一种以编程方式剥离命名空间声明的方法,或者
  3. 假设这两种方法都是错误的,则解释正确的方法。

Update:基于列夫·列维茨基的回答贾克森常见问题解答我想出了以下技巧:

XPathContext context = new XPathContext(
    "foo", 
    document.getRootElement().getNamespaceURI());
Nodes divs = document.query("//foo:div");

我觉得这仍然有点疯狂,但我想这就是贾克森希望你做事的方式。


更新#2:如下所述和整个互联网,这不是贾克森的错; XPath 就是 XPath。

因此,虽然这个 hack 有效,但我仍然想要一种删除名称空间声明的方法。最好不要使用 XSLT。


你可以写:

Nodes divs = document.query("//*[local-name()='div' and namespace-uri()='http://www.w3.org/1999/xhtml']");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 XPath 从具有不必要名称空间的文档中提取 XOM 元素 的相关文章

随机推荐

  • Internet Explorer 中的 Google 地图 JavaScript API 错误

    我为 Google Maps JavaScript API v3 编写了一个非常简单的 jQuery 插件 它可以在 Firefox Chrome 等 中运行 但不能在 Internet Explorer 8 中运行 我收到的错误是以下行中
  • 从网站按钮运行 Chrome 应用程序

    我需要启动一个镀铬应用从网页按钮点击 我找到了以下资源 从 url 运行 Google Chrome 应用程序 从网页激活 Chrome 应用程序 如何通过 JavaScript 启动 Chrome 打包应用程序 这建议使用可外部连接 an
  • 使用 Pkcs10CertificationRequest 获取主题备用名称

    我目前能够解码 CSR 的值 请求的扩展除外 特别是X509v3 Subject Alternative Name 这是相关部分 我的 DecodeCSR 字符串 csr public void DecodeCsr string csrSt
  • 保存的文本字段值在使用 PDFBOX 生成的 PDF 中无法正确显示

    import java io IOException import javax swing text BadLocationException import org apache pdfbox cos COSArray import org
  • 减慢pygame中的移动圈

    我想通过给它更小的 y 和 x 变化来减慢圆的运动 如下所示 if event key pygame K DOWN circleYchange 0 circleXchange 0 circleYchange 0 5 if event key
  • 列表视图中选定索引的问题

    我有一个数组列表 其中包含我自己的类的对象 我想从数组列表中获取对象 该对象的索引 listview的selectedindex 我试过这个 TrackInformation t TrackInformation SongList list
  • 如何在 C++ 中可视化/绘制图表?

    我刚刚了解了图表 我想在随机创建它们时绘制它们 我该怎么做呢 EDIT 我说的是图 它是顶点之间的边的集合 而不是 y f x 的图 什么样的图表 有向图与散点图不同 3D 和 或 2D 图表 你关心它是c还是c 吗 您想要自己编写还是正在
  • C/C++ 中的指针/数组语法 (char **p, *p[n])

    对于指针 我对何时使用 char 或 char 或 array n 等的声明和函数参数感到困惑 就像如果一个函数采用 array n 参数 我是否通过它是 类型吗 我尝试使用从右到左的规则 知道 p 将是一个指向 char 的指针 char
  • 如何使用Fiddler监控WCF服务

    我有一个 WCF 服务 它接受复杂类型并返回一些数据 我想使用 Fiddler 来查看对服务的传入请求是什么样的 客户端是 net 控制台应用程序 它使用服务引用代理 Fiddler 可以做到这一点吗 我是这个工具的新手 过去只使用它通过请
  • python模块的动态加载[重复]

    这个问题在这里已经有答案了 在 python 中 如何在程序运行时动态地将模块添加到包中 我希望能够从外部进程将模块添加到包目录 并能够在我的程序中使用这些新模块 import package def doSomething name pk
  • Qt 和共享文件夹中的文件

    我可以使用 Qt 来选择 打开共享文件夹上的文件吗 我尝试使用 QFileDialog 但似乎没有 网络 类别 如标准 Windows 资源管理器中那样 您需要指定您使用的 Qt 版本 4 7 版本支持本机文件对话框并默认使用它们 请参阅此
  • 如何调整 JavaFX 图像的大小?

    我有一个javafx scene image Image 我想调整它的大小 例如按给定因子缩放 如何做到这一点 无需转换为BufferedImage 有关质量和性能的选项有哪些 例如插值类型 有几个看起来相似的问题 但我找不到问同样问题的人
  • 锁屏时捕获返回按钮按下事件

    我正在尝试编写一个小应用程序来捕获KeyEvent按下后退按钮的次数 当屏幕锁定时 我发现你可以轻松覆盖onKeyDown or onBackPressed为了捕获此事件 但这仅在活动正在运行时才有效 据我了解 在某些 Android 手机
  • Powershell eq 运算符表示哈希值不同,而 Write-Host 显示相反

    我有一个脚本 它定期生成目录中所有文件的列表 然后将结果的文本文件写入不同的目录 我想更改此设置 以便它检查输出目录中的最新文本文件 并且仅在存在差异时才创建一个新文件 这看起来很简单 这是我尝试过的 首先 我获取目录中的最新文件 获取哈希
  • 如何将 XML 查询结果保存到文件中

    我有一个 SQL 查询 并且正在使用 For XML Path 将结果生成为 XML 谁能帮我将 XML 输出转换为 a xml 文件并保存在计算机的特定文件夹中 也想知道除了BCP为了达成这个 你可以尝试使用xp cmdshell Rea
  • C++ 中的 Windows 服务

    我想用 C 创建一个将定期运行的应用程序 很像Windows服务 是否可以用 C 创建 Windows 服务 如果是的话怎么办 有这方面的教程吗 编辑 如何为 Windows 服务创建安装程序 正如另一个答案所示 您需要创建一个普通的 C
  • Jersey ExceptionMapper 未被调用

    我试图调用此异常映射器以返回 404 未找到响应 但它始终返回 500 内部错误 泽西岛版本是2 22 1 下面的代码片段 感谢所有帮助 Thanks 异常映射器类 package org learn rest messengerdemo
  • 引用类时出现 NHibernate 映射问题(延迟加载问题?)

    我正在使用 NHibernate Fluent 来处理我的数据库 并且在查询引用其他数据的数据时遇到问题 我的简单问题是 我是否需要在映射中定义一些 BelongsTo 等 或者在一侧定义引用是否足够 请参阅下面的映射示例 如果是这样 怎么
  • 背景图片在 IE11 中不显示

    由于某种原因 背景图像在 IE11 Windows 7 Pro 中根本不显示 home position relative height 620px background image url images bg home3 jpg back
  • 使用 XPath 从具有不必要名称空间的文档中提取 XOM 元素

    我正在尝试使用 XOM 解析外部系统返回的一些 HTML HTML 看起来像这样 div Help I am trapped in a fortune cookie factory div 实际上它更加混乱 但它有这个 DOCTYPE 声明