Поиск в каталоге Python LXML - PullRequest
0 голосов
/ 29 августа 2011

Я делаю файл SCons для создания документации Docbook.Чтобы отследить зависимости, я хотел бы разрешить поиск файлов каталога по абсолютному пути к файлу.

Итак, скажем, у меня есть немного Docbook XML:

<book xmlns="http://docbook.org/ns/docbook"
      xmlns:xi="http://www.w3.org/2001/XInclude">

  <info> 
    <title>Docbook example document</title>

    <xi:include href="file:///common/logo.xml"
        xpointer="logo"/>

  </info>
  <xi:include href="chap1/chap1.xml"/>
  <xi:include href="chap2/chap2.xml"/>
  <xi:include href="chap3/chap3.xml"/>
  <xi:include href="chap4/chap4.xml"/>

</book>

иФайл catalog.xml:

<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">

  <rewriteURI
    uriStartString="file:///stylesheet/"
    rewritePrefix="file:///home/kst/svn/TOOLS/Docbook/stylesheet/" />

  <rewriteURI
    uriStartString="file:///common/"
    rewritePrefix="file:///home/kst/svn/TOOLS/Docbook/common/" />


  <nextCatalog  catalog="/etc/xml/catalog" />

</catalog>

Получение строки xinclude href не проблема при использовании lxml, но я застрял там.Мне нужен какой-то способ получить абсолютное имя файла, к которому файл: ///common/logo.xml разрешает (в данном случае /home/kst/svn/TOOLS/Docbook/common/logo.xml) из файла каталога.Это должен быть какой-то код Python, чтобы я мог использовать его в своем файле SConstruct без особых хлопот.

Любая помощь приветствуется.

1 Ответ

1 голос
/ 29 августа 2011

Lxml использует поддержку каталога из libxml2 . Используйте переменную окружения XML_CATALOG_FILES, чтобы предоставить список каталогов (вы также можете установить его из python, используя os.environ ), или, если эта переменная отсутствует, она проверяет существование /etc/xml/catalog (конечно, не могу использовать это в Windows).

Альтернативой может быть использование пользовательского распознавателя URI. Вы можете найти больше информации в lxml документах

РЕДАКТИРОВАТЬ: по-видимому, вопрос был не о фактической обработке xinclude, которая работает, а о способе «запросить» каталог или запросить его для фактических имен файлов, которые будут использоваться для включений.

Lxml (по крайней мере, в настоящее время) не имеет API для этого. Однако базовая библиотека libxml2 поддерживает это, и «оригинальные» привязки libxml2 python позволяют вам сделать это (хотя простой документации не хватает, однако строки документации в исходном коде libxml2 помогают, однако). Таким образом, хотя этот модуль не так удобен в использовании, как lxml, он кажется лучшим выбором. Пример, который, кажется, работает:

>>> import libxml2
>>> libxml2.loadCatalog('catalog.xml')
>>> print libxml2.catalogResolveURI('file:///common/logo.xml')
file:///home/kst/svn/TOOLS/Docbook/common/logo.xml
...