libxml2 имеет функцию xmlGetDocEntity (doc, name) , которая возвращает объект, представляющий сущность, с полем URI , содержащим непарсированный URI сущности. Это то, что я использовал для инструмента, который делает что-то похожее: https://github.com/kibook/s1kd-tools/tree/master/tools/s1kd-refs.
Пример использования:
$ s1kd-refs --icn DMC-[...].XML
somegraphic1.cgm
somegraphic2.cgm
Я использую выражение XPath вроде "// @ infoEntityIdent", чтобы получить списокиз всей используемой графики, затем выберите URI объекта для каждого из них. Обратите внимание, что здесь не перечислены все ENTITY, объявленные в DTD, только те, которые фактически используются как <graphic>
s или <symbol>
s в XML.
lxml построен поверх libxml2, но янедостаточно знаком с ним, чтобы знать, существует ли точный эквивалент xmlGetDocEntity.
Другой вариант - сначала использовать XSLT для создания чего-то более простого для анализа:
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="/">
<graphics>
<xsl:apply-templates select="//@infoEntityIdent"/>
</graphics>
</xsl:template>
<xsl:template match="@infoEntityIdent">
<graphic>
<xsl:value-of select="unparsed-entity-uri(.)"/>
</graphic>
</xsl:template>
</xsl:transform>
Вывод:
<graphics>
<graphic>somegraphic1.cgm</graphic>
<graphic>somegraphic2.cgm</graphic>
</graphics>