Objectify xml 标签和属性名称中带有破折号的字符串

Objectify xml string with dashes in tags and attributes names

我正在使用 lxml 对象化 xml 标签中带有破折号的字符串。

例如:

from lxml import objectify
xml_string = """<root>
                   <foo-foo name="example" foo-description="description">
                       <bar doc-name="name" />
                       <test tag="test" />
                    </foo-foo>
                </root>"""
obj = objectify.fromstring(xml_string)

在这一步之后,元素的名称带有破折号。 由于名称中有破折号,我无法访问 foo-foo

如何从标签名称和属性名称中删除破折号?

这可以用 ElementTree 来完成

from xml.etree import ElementTree as ET

xml = """<foo-foo name="example" foo-description="description">
                   <bar doc-name="name" />
                    <test tag="test" />
                </foo-foo>"""

foo_foo = ET.fromstring(xml)
print(f'name: {foo_foo.attrib["name"]}')
print(f'bar dic name: {foo_foo.find("bar").attrib["doc-name"]}')
print(f'test tag: {foo_foo.find("test").attrib["tag"]}')

输出

name: example
bar dic name: name
test tag: test

这很老套,但您可以像这样将元素名称中的 - 转换为 _:

from lxml import etree
from lxml import objectify

xml_string = """<root>
                   <foo-foo name="example" foo-description="description">
                       <bar doc-name="name" />
                       <test tag="test" />
                    </foo-foo>
                </root>"""

doc = etree.fromstring(xml_string)
for tag in doc.iter():
    if '-' in tag.tag:
        tag.tag = tag.tag.replace('-', '_')

obj = objectify.fromstring(etree.tostring(doc))

特别是,我认为可能有更好的方法可以从 doc 中已解析的 XML 文档转到对象化版本,而无需转储和重新解析 XML,但是这是我能在短时间内想到的最好的。