2011-08-29 144 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