【问题标题】:Where is the official specification for XPath syntax?XPath 语法的官方规范在哪里?
【发布时间】:2022-01-02 04:45:53
【问题描述】:

我想编写一个函数来简单地验证 XPath 表达式的语法,独立于任何 XML/HTML(因此它会捕获像 //p[text(}="Hello"] 这样的错字),但我似乎找不到完整的成熟的 XPath 规范。

跟进: 看来我应该跟进,以免人们认为我疯了。我正在尝试编写一个 Rust 过程宏来在编译时捕获格式错误的 xpath,作为一种方便的功能来构建 Rust Selenium 绑定(参见 crates.io 上的三十四或 fantoccini),这样就不必获得 20在 Selenium 崩溃之前进入他们的测试套件几分钟,告诉他们他们有一个与其他语言绑定一样的错字。我可能最终会用另一种语言将 FFI 放到维护良好的库中(实际上 https://crates.io/crates/libxml 可能会成功),但我想我至少会看看自己写这个的工作量是什么。

【问题讨论】:

    标签: xml xpath specifications


    【解决方案1】:

    W3C XPath 建议是 XPath 的官方规范:

    如果您必须从头开始编写 XPath 解析器,则至少需要阅读其中的一个。如果您真的不需要从头开始编写 XPath 解析器,您可以简单地使用现有库并检查返回值或捕获任何解析异常以确定传递的 XPath 表达式的格式是否正确。

    【讨论】:

    • 许多 XPath 实现都是一次性编译后执行的,因此可能很难将语法错误与其他静态错误和动态错误区分开来。但这取决于您要达到的目标。
    【解决方案2】:

    除了官方规范之外,如果您的目标是编写语法检查器,还有一些工具可以帮助您,例如语法和这些语法的解析器生成器,例如 https://bottlecaps.de/rex/,所以使用那里的语法,例如对于 XPath 3.1,您可以生成代码来检查许多目标语言的语法,例如 JavaScript (https://martin-honnen.github.io/xpath31fiddle/js/RExXPath31Fast.js),然后让您的代码使用该解析器,例如检查语法错误

    function parseExample(xpath31Expression) {
        try {
          xpath31Parser = new RExXPath31Fast(xpath31Expression);
          xpath31Parser.parse_XPath();
          console.log(`${xpath31Expression} is fine.`);
        }
        catch (pe) {
          if (pe instanceof xpath31Parser.ParseException) {
            console.log(`Error in ${xpath31Expression}:`);
            console.log(xpath31Parser.getErrorMessage(pe));
          }
        }
    }
    parseExample(`//p[.="Hello"]`);
    parseExample(`//p[text(}="Hello"]`);
    <script src="https://martin-honnen.github.io/xpath31fiddle/js/RExXPath31Fast.js"></script>

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 2022-09-27
    • 2011-04-22
    • 2011-04-09
    • 2014-07-23
    相关资源
    最近更新 更多