我希望能够通过Python编辑现有的XML配置文件,同时保留文件的格式和其中的注释,以便人们仍然可以读懂。
我将更新现有的XML元素并更改值,还将向文件添加新的XML元素。
可用的XML解析器,如ElementTree和lxml,是编辑XML文件的好方法,但在添加新元素时会丢失原始格式和注释。
使用正则表达式似乎是一种选项,但我知道这不建议用于XML。
因此,我正在寻找类似于Python的XML文件编辑器。如何最好地进行操作?谢谢。
我希望能够通过Python编辑现有的XML配置文件,同时保留文件的格式和其中的注释,以便人们仍然可以读懂。
我将更新现有的XML元素并更改值,还将向文件添加新的XML元素。
可用的XML解析器,如ElementTree和lxml,是编辑XML文件的好方法,但在添加新元素时会丢失原始格式和注释。
使用正则表达式似乎是一种选项,但我知道这不建议用于XML。
因此,我正在寻找类似于Python的XML文件编辑器。如何最好地进行操作?谢谢。
最近我使用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)
xml.sax
模块(请参阅Python文档)。