XPath 语法的官方规范在哪里?
Where is the official specification for XPath syntax?
我想编写一个函数来简单地验证独立于任何 XML/HTML 的 XPath 表达式的语法(因此它会发现 //p[text(}="Hello"]
之类的东西有拼写错误),但我不能'似乎找不到完整的 XPath 规范。
跟进:
看来我应该跟进,以免人们认为我疯了。我正在尝试编写一个 Rust 程序宏,用于在编译时捕获格式错误的 xpath,作为构建到 Rust Selenium 绑定中的一种便利功能(请参阅 crates.io 上的 thirtyfour 或 fantoccini),这样就不必在 Selenium 崩溃之前花 20 分钟进入他们的测试套件,告诉他们他们有一个像其他语言绑定一样的拼写错误。我可能最终会用另一种语言对一个维护良好的库进行 FFI(实际上 https://crates.io/crates/libxml 可能会成功),但我想我至少会看到自己编写它的工作量。
W3C XPath 推荐 是 XPath 的官方规范:
- XML Path Language (XPath) Version 1.0
- XML Path Language (XPath) 2.0 (Second Edition)
- XML Path Language (XPath) 3.1
如果您必须从头开始编写 XPath 解析器,那么至少需要阅读其中的一个。如果您真的不需要从头开始编写 XPath 解析器,您可以简单地使用现有的库并检查 return 值或捕获任何解析异常以确定传递的 XPath 表达式的格式是否正确。
除了官方规范之外,如果您的目标是编写语法检查器,还有一些工具可以帮助您实现这一点,例如语法和这些语法的解析器生成器,例如 https://bottlecaps.de/rex/ so using the grammars there, like the one for XPath 3.1, you can generate code to check the syntax in a lot of target languages, like for instance 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>
我想编写一个函数来简单地验证独立于任何 XML/HTML 的 XPath 表达式的语法(因此它会发现 //p[text(}="Hello"]
之类的东西有拼写错误),但我不能'似乎找不到完整的 XPath 规范。
跟进: 看来我应该跟进,以免人们认为我疯了。我正在尝试编写一个 Rust 程序宏,用于在编译时捕获格式错误的 xpath,作为构建到 Rust Selenium 绑定中的一种便利功能(请参阅 crates.io 上的 thirtyfour 或 fantoccini),这样就不必在 Selenium 崩溃之前花 20 分钟进入他们的测试套件,告诉他们他们有一个像其他语言绑定一样的拼写错误。我可能最终会用另一种语言对一个维护良好的库进行 FFI(实际上 https://crates.io/crates/libxml 可能会成功),但我想我至少会看到自己编写它的工作量。
W3C XPath 推荐 是 XPath 的官方规范:
- XML Path Language (XPath) Version 1.0
- XML Path Language (XPath) 2.0 (Second Edition)
- XML Path Language (XPath) 3.1
如果您必须从头开始编写 XPath 解析器,那么至少需要阅读其中的一个。如果您真的不需要从头开始编写 XPath 解析器,您可以简单地使用现有的库并检查 return 值或捕获任何解析异常以确定传递的 XPath 表达式的格式是否正确。
除了官方规范之外,如果您的目标是编写语法检查器,还有一些工具可以帮助您实现这一点,例如语法和这些语法的解析器生成器,例如 https://bottlecaps.de/rex/ so using the grammars there, like the one for XPath 3.1, you can generate code to check the syntax in a lot of target languages, like for instance 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>