2

我被要求编写一些读取 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>

这是那里发生的事情的一个彻底简化的示例。

4

1 回答 1

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)

父.xml:

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

孩子.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>
于 2012-06-20T15:47:18.627 回答