在Python中编辑XML文件以保留文件原始格式的最佳选择是什么?

时间:2014-06-27 14:06:29

标签: python xml

我希望能够通过Python编辑现有的XML配置文件,同时保留文件的格式和文件中的注释,使其仍然是人类可读的。

我将更新现有的XML元素并更改值以及向文件中添加新的XML元素。

可用的XML解析器(如 ElementTree lxml )是编辑XML文件的好方法,但是您放弃了原始格式(向文件添加新元素时)和注释在文件中。

使用正则表达式似乎是一种选择,但我知道不推荐使用XML。

所以我正在寻找Pythonic XML文件编辑器的内容。最好的方法是什么?感谢。

2 个答案:

答案 0 :(得分:0)

我建议您使用SAX解析器解析XML文档,这使您可以非常灵活地进行更改并按原样回写文档。

查看xml.sax模块(参见Python的文档)。

答案 1 :(得分:0)

我最近使用jinja2编写了一个类,将lxml解析的xml格式化为特定格式。如果您可以编写xml文档的实际格式,您可以根据需要进行修改:

class XMLWriter:
    def __init__(self):
        self.env = jinja2.Environment()
        self.env.filters['depth'] = lambda node: len(list(node.iterancestors('*')))
        self.env.filters['is_comment'] = lambda node: node.tag is etree.Comment
        self.template = """<?xml version="1.0" encoding="utf-8"?>
{%- for node in rootnode recursive -%}
  {{- '\n' + '  '*node|depth -}}
  {%- if node|is_comment -%}
    {{- node -}}
  {%- else -%}
    <{{- node.tag -}}
    {%- for key,value in node.attrib.iteritems() -%}
      {{ '\n  ' + '  '*node|depth }}{{ key }}="{{ value }}"
    {%- endfor -%}
    {% if node|count %}>{% endif %}
    {{- loop(node) -}}
    {% if node|count %}{{ '\n' + '  '*node|depth }}</{{ node.tag }}>{% else %}/>{%- endif -%}
  {%- endif -%}
{%- endfor -%}"""

    def __call__(self, rootnode):
        return self.serialize(rootnode)
    def serialize(self, rootnode):
        return self.env.from_string(self.template).render(rootnode=[rootnode])

你使用这样的类:

from lxml import etree
root = etree.fromstring(xml_to_parse, parser=etree.ETCompatXMLParser(remove_comments=False))
# do any modifications you like
writer = XMLWriter()
formatted_result = writer(root)