2011-08-29 183 views
0

我正在为构建Docbook文档制作SCons文件。为了跟踪依赖关系,我想用某种方法将目录文件查找解析为文件的绝对路径。Python LXML目录查找

所以说我有一点的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> 

使用LXML获取XInclude的HREF字符串没有问题,但我被困那里。 我需要的是获取文件的绝对文件名:///common/logo.xml从目录文件中解析到(在本例中是/home/kst/svn/TOOLS/Docbook/common/logo.xml) 。它需要是某种Python代码,所以我可以在SConstruct文件中使用它,而不用太麻烦。

任何帮助表示赞赏。

回答

1

Lxml使用libxml2的目录支持。使用环境变量XML_CATALOG_FILES来提供一个目录列表(你也可以使用os.environ来设置这个目录),或者如果这个变量不存在,它会检查是否存在/etc/xml/catalog(不能在windows上使用这个当然)。

另一种方法是使用自定义URI解析器。你可以找到更多的信息在lxml docs

编辑:显然,问题不是关于实际的xinclude处理,它的工作原理,用于夹杂物。

Lxml(至少目前)没有API来做到这一点。然而,底层的libxml2库确实支持这一点,而“原始”libxml2 python bindings允许你这样做(尽管如此,libxml2帮助源代码中的docstrings仍然缺乏简单的文档)。所以,虽然这个模块不如lxml好用,但它似乎是您最好的选择。似乎工作的例子:

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

我一直在试图做到这一点,但我一直未能得到它的工作。请注意,我对验证文档不感兴趣,但是获取文档包含的任何xml文件的文件名,因此取决于。 –

+0

据我所知,它不仅适用于验证,也适用于xinclude解析。你怎么试试它?你有没有得到任何具体的错误? – Steven

+0

@凯文Steffensen:我刚刚测试了一个简单的例子,并且包含目录的xinclude似乎工作得很好?看起来文件位置或xpointer(它需要一个id为“logo”的属性,我在测试中使用了'xml:id =“logo”''''''''''''尝试不使用xpointer来检查是否可以先包含整个文档,然后继续使用xpointer) – Steven