【发布时间】:2015-03-05 09:21:30
【问题描述】:
我使用的是 saxon HE 9.6,它非常适合在解析格式良好的 XML 文件时使用 XPath 3。
但我想知道如何将 expath-http-client(或任何其他工作解决方案)与 Saxon 结合起来,以解析 realLife©®™(可能已损坏)HTML。 (Java 不是我更好的技能)。
我在谷歌上搜索了很多小时,但没有任何可行的解决方案。我试过类似的东西:
xquery_file.xsl:
xquery version "1.0";
declare namespace http="http://expath.org/ns/http-client";
let $url := 'http://stackoverflow.com'
let $response := http:send-request(
<http:request href="{$url}" method="get"/>
) return
<echo-results>
{$response}
</echo-results>
Shell 命令取自 expath-http-client-saxon-0.10.0 的自述文件
saxon --repo /usr/share/java/expath/repo -xsl:sample/simple-get.xsl -it:main
或
saxon --repo /usr/share/java/expath/repo -xsl:xquery_file.xsl -it:main
没有成功。我得到:Transformation failed: Unknown configuration property http://saxon.sf.net/feature/repo
我最理想的做法是从命令行直接查询 URL,无需 XQuery 文件而是 XPath 表达式(如果可能)。我很确定一些 XML/那里的 Java/XPath 大师有我正在寻找的解决方案。
/usr/share/java/expath/repo 包含:
/usr/share/java/expath/repo
├── expath-http-client-saxon-0.10.0
│ ├── cxan.xml
│ ├── expath-http-client-saxon
│ │ ├── jar
│ │ │ ├── expath-http-client-java.jar
│ │ │ └── expath-http-client-saxon.jar
│ │ ├── lib
│ │ │ ├── apache-mime4j-0.6.jar
│ │ │ ├── commons-codec-1.4.jar
│ │ │ ├── commons-logging-1.1.1.jar
│ │ │ ├── httpclient-4.0.1.jar
│ │ │ ├── httpcore-4.0.1.jar
│ │ │ └── tagsoup-1.2.jar
│ │ ├── xq
│ │ │ └── expath-http-client-saxon.xq
│ │ └── xsl
│ │ └── expath-http-client-saxon.xsl
│ ├── expath-pkg.xml
│ └── saxon.xml
└── hello-1.1
├── expath-pkg.xml
└── hello
├── hello.xq
└── hello.xsl
编辑:
我的最佳尝试(基于 linux 的解决方案)
java -classpath "./tagsoup-1.2.jar:./saxon9he.jar" \
net.sf.saxon.Query \
-x:org.ccil.cowan.tagsoup.Parser \
-s:myrealLife.html \
-qs://*:body
这项工作,但现在我试图弄清楚如何设置default namespace能够通过示例//a直接查询
编辑 2
我根据这个帖子创建了一个完整的github项目,查看https://github.com/sputnick-dev/saxon-lint
【问题讨论】:
-
XML 解析器不适合解析 HTML,因为 HTML 不一定是有效的 XML。
-
实际上,许多 XML 解析都包含或可以与
HTML tidier耦合,这将产生 HTML 的有效 XML 表示。 -
“HTML 不需要是有效的 XML”——更糟糕的是,HTML 甚至不需要是格式正确的 XML。
-
也许有命名空间?你试过
-qs://*:body
标签: java xml xpath xquery saxon