我有一个使用XML名称空间的文档,我想将其/group/house/dogs
增加一个:(该文件名为houses.xml
)
<?xml version="1.0"?>
<group xmlns="http://dogs.house.local">
<house>
<id>2821</id>
<dogs>2</dogs>
</house>
</group>
我当前使用以下代码的结果是:(创建的文件名为houses2.xml
)
<ns0:group xmlns:ns0="http://dogs.house.local">
<ns0:house>
<ns0:id>2821</ns0:id>
<ns0:dogs>3</ns0:dogs>
</ns0:house>
</ns0:group>
我想解决两件事(如果可以使用ElementTree的话)。如果不是的话,我会很乐意建议我应该用什么来代替它):
总之,我不想把文件弄乱得比我必须做的还要多。
我当前的代码(除了上面提到的缺陷之外)生成上述结果如下。
我制作了一个实用程序函数,它使用ElementTree加载一个XML文件并返回ElementTree和名称空间(因为我不想硬编码名称空间,并且愿意承担它所暗示的风险):
def elementTreeRootAndNamespace(xml_file):
from xml.etree import ElementTree
import re
element_tree = ElementTree.parse(xml_file)
# Search for a namespace on the root tag
namespace_search = re.search('^({\S+})', element_tree.getroot().tag)
# Keep the namespace empty if none exists, if a namespace exists set
# namespace to {namespacename}
namespace = ''
if namespace_search:
namespace = namespace_search.group(1)
return element_tree, namespace
这是我的代码,用于更新狗的数量并将其保存到新文件houses2.xml
:
elementTree, namespace = elementTreeRootAndNamespace('houses.xml')
# Insert the namespace before each tag when when finding current number of dogs,
# as ElementTree requires the namespace to be prefixed within {...} when a
# namespace is used in the document.
dogs = elementTree.find('{ns}house/{ns}dogs'.format(ns = namespace))
# Increase the number of dogs by one
dogs.text = str(int(dogs.text) + 1)
# Write the result to the new file houses2.xml.
elementTree.write('houses2.xml')
不幸的是,往返并不是一个小问题。对于XML,除非使用特殊的解析器(比如DecentXML),否则通常不可能保留原始文档。
根据您的需要,您可以选择以下选项:
如果您控制了源代码,并且可以通过单元测试保护代码,那么您可以编写自己的简单解析器。这个解析器不接受XML,只接受有限的子集。例如,您可以将整个文档作为字符串读取,然后使用Python的字符串操作来定位
<dogs>
,并替换下一个<
之前的任何内容。乱劈?对。你可以过滤输出。XML只允许字符串
<ns0:
位于一个位置,因此您可以搜索并用<
替换它,然后用<group xmlns:ns0="
→<group xmlns="
替换它。除非您的XML中有CDATA,否则这是非常安全的。您可以编写自己的简单XML解析器。将输入作为字符串读取,然后为每对
<>
及其在输入中的位置创建元素。这允许您快速分离输入,但仅适用于小输入。基于XML的解决方案是为ElementTree编写一个helper类,该类:
它有一个主要缺点:
我的助手类示例:
输出:
如果有人对此解决方案有改进,请毫不犹豫地获取代码并加以改进。
当Save xml add default_namespace参数很容易避免ns0时,在我的代码中
键代码:xmltree.write(xmlfile,“utf-8”,默认的_namespace=xmlnamespace)
相关问题 更多 >
编程相关推荐