【发布时间】:2014-11-08 19:26:05
【问题描述】:
我对用于解析 xml 文件的 python 脚本有疑问。这是xml文件:
文件.xml
<Tag1 SchemaVersion="1.1" xmlns="http://www.microsoft.com/axe">
<RandomTag>TextText</RandomTag>
<Tag2 xmlns="http://schemas.datacontract.org/2004/07">
<AnotherRandom>Abc</AnotherRandom>
</Tag2>
</Tag1>
我使用xml.etree.ElementTree 作为解析方法。我的任务是更改RandomTag 之间的标签(在本例中为“TextText”)。这是python代码:
python 代码
import xml.etree.ElementTree as ET
customXmlFile = 'file.xml'
ns = {
'ns': 'http://www.microsoft.com/axe',
'sc': 'http://schemas.datacontract.org/2004/07/Microsoft.Assessments.Relax.ObjectModel_V1'
}
tree = ET.parse(customXmlFile)
root = tree.getroot()
node = root.find('ns:RandomTag', namespaces=ns)
node.text = 'NEW TEXT'
ET.register_namespace('', 'http://www.microsoft.com/axe')
tree.write(customXmlFile + ".new",
xml_declaration=True,
encoding='utf-8',
method="xml")
我没有运行时错误,代码工作正常,但所有命名空间都在第一个节点 (Tag1) 中定义,AnotherRandom 和 Tag2 使用了快捷方式。此外,SchemaVersion 也被删除。
file.xml.new - 输出
<?xml version='1.0' encoding='utf-8'?>
<Tag1 xmlns="http://www.microsoft.com/axe" xmlns:ns1="http://schemas.datacontract.org/2004/07" SchemaVersion="1.1">
<RandomTag>NEW TEXT</RandomTag>
<ns1:Tag2>
<ns1:AnotherRandom>Abc</ns1:AnotherRandom>
</ns1:Tag2>
</Tag1>
file.xml.new - 所需的输出
<Tag1 SchemaVersion="1.1" xmlns="http://www.microsoft.com/axe">
<RandomTag>TextText</RandomTag>
<Tag2 xmlns="http://schemas.datacontract.org/2004/07">
<AnotherRandom>NEW TEXT</AnotherRandom>
</Tag2>
</Tag1>
我应该改变什么来获得与开始时完全相同的 XML 格式,只是改变了文本?
【问题讨论】:
-
您的 xml 文件和您的代码一样存在一些问题。根据您的代码,它会输出一些代码。如果您可以修复有助于我们诊断问题的拼写错误。请发布完整的工作代码。例如,您的 ns 字典应该使用冒号而不是等号。以及结束 Tag1 应该有一个正斜杠等。
-
我解决了这两个问题。我无法复制整个 xml 代码,因为它很大。主要是结构和这个一样,python代码如题。
-
我也相信 find() 调用中应该是命名空间而不是命名空间,你确定没有更多的错别字吗?你的进口等呢?您确实需要确保复制/粘贴应该是有效的代码。另外,您使用的是什么版本的 Python?
-
我使用的是 python 2.7。
-
我已经编辑了代码。我执行它,输出与quntion中的输出相同。