我应该如何在python中使用lxml处理XLink引用?

时间:2012-05-30 16:26:30

标签: python lxml xlink

我被要求编写一些读取XML配置文件的脚本,这些脚本可以自由地使用XLink来包含存储在多个文件中的XML。例如:

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

(#{common.environment}是一个首先得到解析的属性占位符,可以在此处忽略。)该公司已在lxml上标准化,以便在python中进行高级XML处理。

我一直在寻找有关如何在这些限制下处理这些事件的示例或文档,并且至少将它们的内容包含在父XML文档中,就像它们实际上是在那时插入一样。我有点惊讶地发现那里的宝贝很少,我想知道我是否遗漏了一些明显的东西。我已经找到了关于XLink的通用文档,我发现了一些在XSLT处理环境中使用它的例子。但这对我没有帮助。

任何人都可以提供有关如何最好地实施此建议的任何建议,无论是文档,示例还是经验中的一些建议?感谢。

更新:以下是前后示例:

在。这就是要解析的文件中的实际内容:

<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>

这是一个从根本上简化的例子。

1 个答案:

答案 0 :(得分:2)

这个答案可能与您真正需要的答案相差甚远,但也许它可能会有所帮助。下面的小程序是基于“从根本上简化”的例子我能想到的。

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>