【问题标题】:Objectify xml string with dashes in tags and attributes names在标签和属性名称中使用破折号对象化 xml 字符串
【发布时间】:2021-08-11 11:07:41
【问题描述】:

我正在使用 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

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

【问题讨论】:

  • 你想从给定的 xml 中得到什么?
  • 我希望能够访问 foo-foo 及其子子项。例如obj.foo-fooobj.foo-foo.bar 都应该可以访问。
  • @mzjn 这只是一个例子。我现在已经编辑了描述。
  • 我怀疑这可能是相关的:stackoverflow.com/q/2064329/407651
  • ...但请注意,如果您使用 getattr 而不是点表示法,您可以访问带有破折号的属性。例如,如果你有一个 bar-bar 元素,你可以 getattr(obj, 'bar-bar')

标签: python xml lxml lxml.objectify


【解决方案1】:

这很 hacky,但您可以执行以下操作将元素名称中的 - 转换为 _

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

【讨论】:

【解决方案2】:

这可以通过 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-27
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多