【问题标题】:Alter XML while preserving layout在保留布局的同时更改 XML
【发布时间】:2009-10-27 09:40:25
【问题描述】:

您会使用什么来更改 XML 文件,同时尽可能保留布局,包括缩进和 cmets?

我的问题是我有几个描述用户界面的大量手工编辑的 XML 文件,现在我需要将几个属性翻译成另一种语言。

我尝试过使用 Python + ElementTree 进行此操作,但它既没有保留空白也没有保留 cmets。

我已经看到有人建议使用 XSLT 来解决类似的问题,但我认为在这种情况下这不是替代方案,因为我需要对每个属性进行一些逻辑和查找。

最好保留每个元素中的属性顺序,但我可以容忍更改顺序。

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    任何 DOM 操作模块都应该满足您的需求。布局只是一个文本数据,所以它在 DOM 中表示为文本节点:

    >>> from xml.dom.minidom import parseString
    >>> dom = parseString('''\
    ... <message>
    ...   <text>
    ...     Hello!
    ...   </text>
    ... </message>''')
    >>> dom.childNodes[0].childNodes
    [<DOM Text node "u'\n  '">, <DOM Element: text at 0xb765782c>, <DOM Text node "u'\n'">]
    >>> text = dom.getElementsByTagName('text')[0].childNodes[0]
    >>> text.data = text.data.replace(u'Hello', u'Hello world')
    >>> print dom.toxml()
    <?xml version="1.0" ?><message>
      <text>
        Hello world!
      </text>
    </message>
    

    【讨论】:

    • IMO minidom 不适合保存手写 XML 布局的任务,因为它会重新排序属性 for example
    【解决方案2】:

    如果您使用 XSLT 处理器,例如 xt,那么您可以在 Java 中编写扩展方法来执行您需要的任意转换。

    话虽如此,我已经成功地使用了 Python 的 xml.dom.minidom 模块进行这种转换。它确实保留了空白和布局。

    【讨论】:

    • 根据我的经验,从 python 3.9 开始,minidom 不保留空格和布局。这在以前的版本中有效吗?
    猜你喜欢
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多