【问题标题】:Updating XML elements and attribute values using Python etree使用 Python etree 更新 XML 元素和属性值
【发布时间】:2012-02-28 22:42:24
【问题描述】:

我正在尝试使用 Python 2.7 的 ElementTree 库来解析 XML 文件,然后将特定元素属性替换为测试数据,然后将其保存为唯一的 XML 文件。

我对解决方案的想法是 (1) 通过将文件读取到字符串来从 CSV 文件中获取新数据,(2) 在某些分隔符标记处对字符串进行切片,(3) 附加到列表,然后 ( 4) 使用ElementTree 将属性更新/删除/替换为列表中的特定值。

我查看了ElementTree 文档并看到了clear()remove() 函数,但我不知道如何充分使用它们。

下面是要修改的 XML 示例 - 带有 XXXXX 的属性将被替换/更新:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="XXXXX">
        <Pty ID="XXXXX" R="1"/>
    </RptSide>
</TrdCaptRpt>

预期的结果将是,例如:

<TrdCaptRpt RptID="10000001" TransTyp="0">
    <RptSide Side="1" Txt1="12345">
        <Pty ID="ABCDE" R="1"/>
    </RptSide>
</TrdCaptRpt>

如何使用etree 命令更改基本 XML 以使用列表 [] 中的项目进行更新?

【问题讨论】:

    标签: python xml elementtree xml.etree


    【解决方案1】:

    对于这种工作,我总是推荐BeautifulSoup,因为它有一个非常容易学习的API:

    from BeautifulSoup import BeautifulStoneSoup as Soup
    
    xml = """
    <TrdCaptRpt RptID="10000001" TransTyp="0">
        <RptSide Side="1" Txt1="XXXXX">
            <Pty ID="XXXXX" R="1"/>
        </RptSide>
    </TrdCaptRpt>
    """
    
    soup = Soup(xml)
    rpt_side = soup.trdcaptrpt.rptside
    rpt_side['txt1'] = 'Updated'
    rpt_side.pty['id'] = 'Updated'
    
    print soup
    

    示例输出:

    <trdcaptrpt rptid="10000001" transtyp="0">
    <rptside side="1" txt1="Updated">
    <pty id="Updated" r="1">
    </pty></rptside>
    </trdcaptrpt>
    

    编辑:使用xml.etree.ElementTree,您可以使用以下脚本:

    from xml.etree import ElementTree as etree
    
    xml = """
    <TrdCaptRpt RptID="10000001" TransTyp="0">
        <RptSide Side="1" Txt1="XXXXX">
            <Pty ID="XXXXX" R="1"/>
        </RptSide>
    </TrdCaptRpt>
    """
    
    root = etree.fromstring(xml)
    rpt_side = root.find('RptSide')
    rpt_side.set('Txt1', 'Updated')
    pty = rpt_side.find('Pty')
    pty.set('ID', 'Updated')
    print etree.tostring(root)
    

    示例输出:

    <TrdCaptRpt RptID="10000001" TransTyp="0">
        <RptSide Side="1" Txt1="Updated">
            <Pty ID="Updated" R="1" />
        </RptSide>
    </TrdCaptRpt>
    

    【讨论】:

    • 非常感谢,一旦我终于让 BS 正确安装,您的建议就奏效了。我对其他方式感兴趣,有没有使用标准 eTree 命令的方法?
    • @NickH 我用ElementTree的例子更新了我的答案
    • 稍作修改后,此解决方案已完美满足我的需求,我修改了 set 命令以使用已定义列表中的索引,并将 fromstring 替换为指向我的 XML 文件的 etree.parse。非常感谢您的建议!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2019-03-11
    • 2019-06-18
    • 2017-04-16
    • 2021-12-13
    • 2019-07-18
    • 1970-01-01
    相关资源
    最近更新 更多