编辑:其他人回应说,对于我在这里发布的这个简单问题,xslt是一个更好的解决方案。我暂时删除了我的答案。
我已经读过十几篇StackOverflow文章,试图理解如何导入一个具有名称空间的XML文档,修改它,然后在不更改名称空间的情况下编写它。我发现了一些不清楚或有矛盾信息的东西。终于让它发挥作用了,我想把我学到的东西记录下来,希望它能帮助其他同样困惑的人。我将在这里提出问题,并在回答中给出答案。
问题是:给定
Python docs
如何导航树,而不必在XPath for findall中显式地包含名称空间URI,并在保留名称空间前缀的情况下将其写回。文档中的示例代码没有给出完整的解决方案。
以下是XML数据:
<?xml version="1.0"?>
<actors xmlns:fictional="http://characters.example.com"
xmlns="http://people.example.com">
<actor>
<name>John Cleese</name>
<fictional:character>Lancelot</fictional:character>
<fictional:character>Archie Leach</fictional:character>
</actor>
<actor>
<name>Eric Idle</name>
<fictional:character>Sir Robin</fictional:character>
<fictional:character>Gunther</fictional:character>
<fictional:character>Commander Clement</fictional:character>
</actor>
</actors>
所需的输出只是在演员姓名前加上“先生”,如下所示:
<actors xmlns="http://people.example.com" xmlns:fictional="http://characters.example.com">
<actor>
<name>Sir John Cleese</name>
<fictional:character>Lancelot</fictional:character>
<fictional:character>Archie Leach</fictional:character>
</actor>
<actor>
<name>Sir Eric Idle</name>
<fictional:character>Sir Robin</fictional:character>
<fictional:character>Gunther</fictional:character>
<fictional:character>Commander Clement</fictional:character>
</actor>
</actors>