2012-05-30 2 views
2

Мне было предложено написать несколько сценариев, которые читаются в файлах конфигурации XML, которые используют либеральное использование XLink для включения XML, хранящегося в нескольких файлах. Например:Как обрабатывать ссылки XLink с помощью lxml в python?

<Environment xlink:href="#{common.environment}" /> 

(# {common.environment} это свойство заполнитель, который получает разрешен первый и могут быть проигнорированы здесь.) Компания имеет стандартизированный на LXML для дополнительной обработки XML в Python.

Я искал примеры или документы о том, как обрабатывать эти вхождения под этими ограничениями и, как минимум, включать их содержимое в родительский XML-документ, как если бы они были фактически вставлены в этот момент. Я был немного удивлен, найдя там немного драгоценного материала, до такой степени, что мне интересно, не хватает ли я чего-то очевидного. Я нашел общие документы о том, что такое XLink, и я нашел несколько примеров того, как он используется в контексте обработки XSLT. Однако это не помогло мне.

Может ли кто-нибудь предложить какие-либо рекомендации о том, как наилучшим образом реализовать это, будь то документы, примеры или только некоторые советы из опыта? Благодарю.

UPDATE: Вот до и после того, как, например:

Перед. Это то, что на самом деле в файле разбираемый:

<Root> 
    <Environment xlink:href="#{common.environment}" /> 
</Root> 

Это то, что находится в файле, # {} common.environment ПОСТАНОВЛЯЕТ:

<?xml version="1.0" encoding="UTF-8"?> 
<Environment> 
    <Property key="hello.world" value="foo" /> 
    <Property key="bar.baz" value="fred" /> 
</Environment> 

После. Это как анализатор «видит» это после того, как вся обработка выполняется:

<Root> 
    <Environment> 
     <Property key="hello.world" value="foo" /> 
     <Property key="bar.baz" value="fred" /> 
    </Environment> 
</Root> 

Это радикально упростили пример того, что происходит там.

+0

Почему бы не использовать XInclude вместо XLink? – mzjn

+0

Если бы это было до меня, XInclude это было бы. К сожалению, сотни таких конфигурационных файлов используются десятками программных систем по всей компании с использованием XLink, как в моем примере. Существует много производственного кода, написанного на Java и C, которые читают эти файлы и ищут xlink: экземпляры href для включения. (Мне было поручено сделать что-то на питоне.) Убедительное управление для «исправления» этого никогда не произойдет. И вот я здесь. – tima

+2

Что такое ожидаемый результат, когда обрабатывается что-то вроде ''? Можете ли вы предоставить пример «до и после» с более подробной информацией? – mzjn

ответ

1

Этот ответ, вероятно, будет далек от того, что вам действительно нужно, но, возможно, это может помочь. Ниже приведена небольшая программа, основанная на «радикально упрощенном» примере.

from lxml import etree 

parent = etree.parse("parent.xml").getroot() 
penv = parent.xpath("Environment") 

for e in penv: 
    child = e.get("{http://www.w3.org/1999/xlink}href") 
    c = etree.parse(child).getroot() 
    parent.replace(e, c) 

print etree.tostring(parent) 

parent.xml:

<Root xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <Environment xlink:href="child.xml"/> 
</Root> 

child.xml:

<Environment> 
    <Property key="hello.world" value="foo" /> 
    <Property key="bar.baz" value="fred" /> 
</Environment> 

Когда программа запущена, она выводит:

<Root xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <Environment> 
    <Property key="hello.world" value="foo"/> 
    <Property key="bar.baz" value="fred"/> 
</Environment></Root> 
+0

Спасибо mzjn. Я отказался от ответа на этот вопрос. Я думал, что это будет нечто вроде творения.Не зная, какой узел может иметь xlink: href может потребовать, чтобы я сделал поиск по xpath, чтобы найти любой узел с этим конкретным атрибутом, а затем обработать включение файла XML для каждого. Еще раз спасибо. – tima

Смежные вопросы