【问题标题】:insert list of elements in loop inside element builder in lxml在lxml中的元素构建器内的循环中插入元素列表
【发布时间】:2020-09-22 06:54:15
【问题描述】:

我有一个使用 lxml.etree.E 模块构建的 XML 正文。它看起来像这样 -

E.TAGA(
    E.TAGB(
        E.TAGC(
            ...list goes here...
        )
    )
)

这种构造方法不能改变。

我有一个字符串列表["textA", "textB", "textC"],必须将其添加到TAGC 下的xml(如上所示),每个条目都包含在另一个标签TAGD 中。我曾尝试使用fromStringlist,但它不起作用。请帮忙。希望我的问题很清楚。

这就是最终的 XML 代码应该出现的样子 -

E.TAGA(
    E.TAGB(
        E.TAGC(
            E.TAGD(textA),
            E.TAGD(textB),
            E.TAGD(textC)
        )
    )
)

这是所需的输出 -

<TAGA>
    <TAGB>
        <TAGC>
            <TAGD>textA</TAGD>
            <TAGD>textB</TAGD>
            <TAGD>textC</TAGD>
        </TAGC>
    </TAGB>
</TAGA>

【问题讨论】:

  • 你能告诉我们实际想要的输出吗? “最终 XML”不是 XML。
  • 预期的 XML 结果是什么?
  • 我已经更新了我的问题。请看一看。
  • 你提到了一个字符串列表。那看起来像什么?请提供minimal reproducible example,
  • 更新了问题。请参见。 :)

标签: python python-3.x xml list lxml


【解决方案1】:

使用 * 运算符在函数调用中解包列表...

也就是说,生成一个包含你的列表

E.TAGD(textA),
E.TAGD(textB),
E.TAGD(textC)

然后将前缀为 *(解包运算符)的列表作为参数提供给 E.TAGC

【讨论】:

    【解决方案2】:

    以下(使用核心 python XML 库)

    import xml.etree.ElementTree as ET
    
    d_data = ['T1', 'T2', 'T3']
    
    a = ET.Element('A')
    b = ET.SubElement(a, 'B')
    c = ET.SubElement(b, 'C')
    for text in d_data:
        temp = ET.SubElement(c, 'D')
        temp.text = text
    ET.dump(a)
    

    输出

    <?xml version="1.0" encoding="UTF-8"?>
    <A>
       <B>
          <C>
             <D>T1</D>
             <D>T2</D>
             <D>T3</D>
          </C>
       </B>
    </A>
    

    【讨论】:

    • 我已经提到 XML 是使用 lxml 构造的。它是 API 的一部分,无法替换。而且XML的构造方法也不能改变。
    猜你喜欢
    • 2014-07-04
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    相关资源
    最近更新 更多