【问题标题】:Python: Xml parsing methodPython:Xml解析方法
【发布时间】: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) 中定义,AnotherRandomTag2 使用了快捷方式。此外,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中的输出相同。

标签: python xml parsing


【解决方案1】:

这有点小技巧,但会做你想做的事。然而,像这样玩弄命名空间肯定违反了 XML 标准。如果您想更好地处理命名空间,我建议您查看lxml

您必须在解析文件之前调用register_namespace()。由于对该函数的重复调用会覆盖以前的映射,因此您必须手动编辑内部字典。

import xml.etree.ElementTree as ET

customXmlFile = 'test.xml'

ns = {'ns': 'http://www.microsoft.com/axe',
      'sc': 'http://schemas.datacontract.org/2004/07/'}

ET.register_namespace('', 'http://www.microsoft.com/axe')
ET._namespace_map['http://schemas.datacontract.org/2004/07'] = ''

tree = ET.parse(customXmlFile)
root = tree.getroot()
node = root.find('ns:RandomTag', namespaces=ns)
node.text = 'NEW TEXT'

tree.write(customXmlFile + ".new",
       xml_declaration=True,
       encoding='utf-8',
       method="xml")

有关此的更多信息,请参阅:

http://effbot.org/zone/element-namespaces.htm

Saving XML files using ElementTree

Cannot write XML file with default namespace

【讨论】:

  • 感谢您的回答。我已经尝试过您的解决方案,但输出不是我想要的。实际上,我不再有那些快捷方式“ns1”,但所有命名空间都在第一个标签中定义。我需要准确定义它的位置。我在互联网上做了一些研究,但我一无所获。最后,我像解析文本文件一样解析 xml 文件,并使用特定于字符串的函数更改所需的值。
  • 我意识到这不是您想要的。很高兴你找到了有用的东西。
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2015-06-10
  • 2019-08-28
相关资源
最近更新 更多