【问题标题】:How do I set attributes for an XML element with Python?如何使用 Python 为 XML 元素设置属性?
【发布时间】:2023-03-05 10:20:01
【问题描述】:

我正在使用 ElementTree 构建一个 XML 文件。

当我尝试使用ET.SubElement().__setattr__() 设置元素的属性时,我收到错误AttributeError: __setattr__

import xml.etree.cElementTree as ET
summary = open(Summary.xml, 'w')
root = ET.Element('Summary')
ET.SubElement(root, 'TextSummary')
ET.SubElement(root,'TextSummary').__setattr__('Status','Completed') # Error occurs here
tree = ET.ElementTree(root) 
tree.write(summary)
summary.close()

代码执行后,我的 XML 应如下所示:

<Summary>
    <TextSummary Status = 'Completed'/>
</Summary>

如何使用 Python 使用 xml.etree.cElementTree 向 XML 元素添加属性?

【问题讨论】:

    标签: python xml python-2.7 elementtree


    【解决方案1】:

    你应该这样做:

    ET.SubElement(root,'TextSummary').set('Status','Completed')
    

    Etree documentation shows usage

    【讨论】:

    【解决方案2】:

    您可以在创建过程中使用关键字参数为ElementSubElement 指定属性。

    import xml.etree.ElementTree as ET
    
    root = ET.Element('Summary')
    ET.SubElement(root, 'TextSummary', Status='Completed')
    

    XML:

    <Summary>
        <TextSummary Status="Completed"/>
    </Summary>
    

    或者,您可以使用.set 向现有元素添加属性。

    import xml.etree.ElementTree as ET
    
    root = ET.Element('Summary')
    sub = ET.SubElement(root, 'TextSummary')
    sub.set('Status', 'Completed')
    

    XML:

    <Summary>
        <TextSummary Status="Completed"/>
    </Summary>
    

    技术说明:

    ElementSubElement 的构造函数包括**extra,它接受属性作为关键字参数。

    xml.etree.ElementTree.Element(tag, attrib={}, **extra)
    xml.etree.ElementTree.SubElement(parent, tag, attrib={}, **extra)
    

    这允许您添加任意数量的属性。

    root = ET.Element('Summary', Date='2018/07/02', Timestamp='11:44am')
    # <Summary Date = "2018/07/02" Timestamp = "11:44am">
    

    您还可以使用 .set 将属性添加到预先存在的元素。但是,这一次只能添加一个元素。 (As suggested by Thomas Orozco)。

    root = ET.Element('Summary')
    root.set('Date', '2018/07/02')
    root.set('Timestamp', '11:44am')
    # <Summary Date = "2018/07/02" Timestamp = "11:44am">
    

    完整示例:

    import xml.etree.ElementTree as ET
    
    root = ET.Element('school', name='Willow Creek High')
    ET.SubElement(root, 'student', name='Jane Doe', grade='9')
    print(ET.tostring(root).decode())
    # <school name="Willow Creek High"><student grade="9" name="Jane Doe" /></school>
    

    【讨论】:

      【解决方案3】:

      在单行中设置多个属性的最佳方法如下。 我为创建 SVG XML 编写了这段代码:

      from xml.etree import ElementTree as ET
      
      svg = ET.Element('svg', attrib={'height':'210','width':'500'})
      g = ET.SubElement(svg,'g', attrib={'x':'10', 'y':'12','id':'groupName'})
      line = ET.SubElement(g, 'line', attrib={'x1':'0','y1':'0','x2':'200','y2':'200','stroke':'red'})
      
      print(ET.tostring(svg, encoding="us-ascii", method="xml"))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-21
        • 2018-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多