我想解析install.rdf内部文件uBlock0.firefox-legacy.xpi文件。
我想要得到的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
Run Code Online (Sandbox Code Playgroud)
编辑1:xmllint无法解析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
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点 ?
这是一个RDF / XML文件。RDF / XML解析器可以将文件解析为RDF图,然后可以使用SPARQL查询来提取所需的信息。一个简单的SPARQL查询将是:
SELECT * { <urn:mozilla:install-manifest> ?property ?value }
Run Code Online (Sandbox Code Playgroud)
但这返回的属性比问题中列出的更多。结果可以像这样被限制:
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
}
Run Code Online (Sandbox Code Playgroud)
我们可以将此查询存储在文件中,query.sparql以备后用。
RDF / XML和SPARQL是W3C标准,具有许多实现。我倾向于使用Apache Jena,这是一个基于Java的RDF框架,它带有sparql命令行工具。通过简单的查询,可以这样调用它:
SELECT * { <urn:mozilla:install-manifest> ?property ?value }
Run Code Online (Sandbox Code Playgroud)
支持多种输出格式(请参阅参考资料sparql --help)。TSV(制表符分隔)是进行进一步处理的不错选择。使用之前保存的查询文件,可以这样调用它:
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
}
Run Code Online (Sandbox Code Playgroud)
输出:
sparql --data install.rdf "SELECT * { <urn:mozilla:install-manifest> ?property ?value }"
Run Code Online (Sandbox Code Playgroud)
另一个选择是Rasqal,它是Redland RDF库的一部分。Rasqal不需要运行JVM,可以通过常规的程序包管理器进行安装,但是与Jena相比,它有点麻烦。它带有一个称为的命令行工具roqet:
sparql --data install.rdf --query query.sparql --results TSV --quiet
Run Code Online (Sandbox Code Playgroud)
输出与sparql上面相同。