如何从命令行解析rdf格式文件

时间:2019-05-22 18:59:22

标签: bash awk rdf

我想解析uBlock0.firefox-legacy.xpi文件中的install.rdf文件。

我想像这样从em:id文件中获取em:nameem:versionem:descriptionem:homepageURLinstall.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

我该怎么做?

1 个答案:

答案 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中,以备后用。

使用Apache Jena

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相同。