XPath 笔记本:XError:Focus for / 不存在;代码:XPDY0002

Posted

技术标签:

【中文标题】XPath 笔记本:XError:Focus for / 不存在;代码:XPDY0002【英文标题】:XPath notebook: XError:Focus for / is absent; code:XPDY0002 【发布时间】:2022-01-21 09:38:32 【问题描述】:

我有一个简单的问题要问你。我想统计一下沉重的 XML 文件中包含多少个节点。

例如:(在这种情况下,Xpath 表达式应该给我桥节点的计数,即 1)

<?xml version="1.0" standalone="yes"?>
<full_info>
  <bridge>
    <FFF3>12314</FFF3>
    ...
  </bridge>
</full_info>

这是我的 Xpath 表达式:

count(//full_info/bridge)

但是这个命令不断地给出这个错误:

XError:/ 的焦点不存在;代码:XPDY0002

如何解决这个问题?请帮帮我

【问题讨论】:

那么,您如何针对 XML 运行该代码,您是否正在编写例如C# 或 Java 代码,使用一些 XPath 库?请向我们展示必要的详细信息。或者你正在使用一些 VS Code 扩展?然后告诉我们您使用哪一个以及如何使用它。该错误消息似乎表明尚未设置 XPath 评估的焦点/上下文。 如果使用的是 XPath 笔记本扩展,请确保您在 VS Studio 代码中打开了保存的 XML 输入文件。 @MartinHonnen 很抱歉我目前正在使用 Xpath 笔记本 我无法重现这一点,只要我在 VS 代码中打开保存的 XML 文档,然后 XPath 3.1 笔记本扩展使用该文档作为上下文项并且我没有收到命名错误。只有在 VS Code 中没有打开用作上下文项的 XML 文档时才会出现。 @MartinHonnen 抱歉,我的 xml 文件太大了。 VScode 给我内存不足异常。所以在这种情况下,笔记本实际上是无法执行这样的命令的。我正在小 xml 文件上测试这个计数命令,它有效!这意味着我的问题发生了变化,例如如何在 VScode 上完全打开大文件? 【参考方案1】:

一般来说,传统的 XPath 不是处理大型(GB 输入)XML 文档的好工具,因此您可能需要研究更高级的技术,例如 XSLT 3 和 Saxon 10 EE 或 SaxonCS 允许运行的流式处理

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
  
  <xsl:output method="text"/>
  
  <xsl:mode streamable="yes"/>
  
  <xsl:template match="/">
    <xsl:value-of select="count(//full_info/bridge)"/>
  </xsl:template>
  
</xsl:stylesheet>

并且不会在内存中构建完整的树,而是流过并计算节点。

另一种选择是查看 BaseX 或 eXist-db 或其他 XML 数据库系统,您需要先将巨大的 XML 放入数据库中,然后希望用于计算节点的 XPath 或 XQuery 不会导致内存问题。

【讨论】:

以上是关于XPath 笔记本:XError:Focus for / 不存在;代码:XPDY0002的主要内容,如果未能解决你的问题,请参考以下文章

爬虫神器xpath的用法

xpath笔记-转

Python爬虫:Xpath语法笔记

XPath路径表达式笔记(转载)

xpath路径表达式笔记(转载)

笔记:XML-解析文档-XPath 定位信息