我想解析uBlock0.firefox-legacy.xpi文件中的install.rdf
文件。
我想像这样从em:id
文件中获取em:name
,em:version
,em:description
,em:homepageURL
和install.rdf
:>
em:id uBlock0@raymondhill.net
em:name uBlock Origin
em:version 1.16.4.10
em:description Finally, an efficient blocker. Easy on CPU and memory.
em:homepageURL https://github.com/gorhill/uBlock
编辑1:xmllint
无法解析install.rdf
文件:
$ cat install.rdf | xmllint --xpath '((//em:description)[1] | (//em:id)[1] | (//em:name)[1] | (//em:version)[1] | (//em:homepageURL)[1])/text()' -
XPath error : Undefined namespace prefix
XPath evaluation failure
$ echo $?
10
我该怎么做?
答案 0 :(得分:2)
这是RDF / XML文件。 RDF / XML解析器可以将文件解析为RDF图,然后可以使用SPARQL查询来提取所需的信息。一个简单的SPARQL查询将是:
SELECT * { <urn:mozilla:install-manifest> ?property ?value }
但是返回的属性比问题中列出的更多。结果可以像这样被限制:
PREFIX em: <http://www.mozilla.org/2004/em-rdf#>
SELECT * {
VALUES (?property) { (em:id) (em:name) (em:version) (em:description) (em:homepageURL) }
<urn:mozilla:install-manifest> ?property ?value
}
我们可以将此查询存储在文件query.sparql
中,以备后用。
RDF / XML和SPARQL是W3C标准,具有许多实现。我倾向于使用Apache Jena,这是一个基于Java的RDF框架,它带有sparql
命令行工具。通过简单的查询,可以这样调用它:
sparql --data install.rdf "SELECT * { <urn:mozilla:install-manifest> ?property ?value }"
支持多种输出格式(请参见sparql --help
); TSV(制表符分隔)是进行进一步处理的不错选择。有了先前保存的查询文件,就可以这样调用它:
sparql --data install.rdf --query query.sparql --results TSV --quiet
输出:
?property ?value
<http://www.mozilla.org/2004/em-rdf#id> "uBlock0@raymondhill.net"
<http://www.mozilla.org/2004/em-rdf#name> "uBlock Origin"
<http://www.mozilla.org/2004/em-rdf#version> "1.16.4.10"
<http://www.mozilla.org/2004/em-rdf#description> "Finally, an efficient blocker. Easy on CPU and memory."
<http://www.mozilla.org/2004/em-rdf#homepageURL> "https://github.com/gorhill/uBlock"
另一个选项是Rasqal,它是Redland RDF Libraries的一部分。 Rasqal不需要运行JVM,可以通过常规的程序包管理器进行安装,但是与Jena相比,它有点麻烦。它带有一个名为roqet
的命令行工具:
roqet -D install.rdf -r tsv query.sparql
输出与上述sparql
相同。