我被要求编写一些读取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>
这是一个从根本上简化的例子。
答案 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>