我被要求编写一些读取 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>
这是一个极其简化的示例,说明了其中发生的情况。
最佳答案
这个答案可能与您真正需要的相去甚远,但也许它可以提供一些帮助。下面的小程序是我根据“彻底简化”的示例想出的。
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>
关于python - 我应该如何在 python 中使用 lxml 处理 XLink 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10820351/