Как разобрать файл формата rdf из командной строки - PullRequest
3 голосов
/ 22 мая 2019

Я хочу проанализировать файл 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

EDIT 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 Ответ

5 голосов
/ 23 мая 2019

Это файл 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 выше.

...