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,但是这是我能在短时间内想到的最好的。
我正在使用 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,但是这是我能在短时间内想到的最好的。