为了账号安全,请及时绑定邮箱和手机立即绑定

如何通过 python 替换 XML 节点

如何通过 python 替换 XML 节点

森栏 2023-05-09 10:06:35
我是 python 的新手,我有一个 - 也许 - 愚蠢的 XML 文件问题(是的,我试图用谷歌搜索解决方案但没有结果)。我必须编写一个程序来替换/切换两件事,所以首先,这是 XML 数据,它看起来像这样:<data='qwerty'>    <name_it>some_name</name_it></data><next_data='next_qwerty'>    <name_it>another_name</name_it></next_data><next_next_data>...</next_next_data><next_xyz_data>...etc.我如何在 python 中更改some_name为data=''?所以它应该是这样的:<data='some_name'>                            #changed from 'qwerty' to some_name    <name_it>some_name</name_it></data><next_data='another_name'>                    #changed from 'next_qwerty' to another_name    <name_it>another_name</name_it></next_data>如果这是一个愚蠢的问题,对此感到抱歉,但我真的用谷歌搜索了它,但我找不到解决方案。更新:这是我写的几行 python 代码:from xml_file import datanew=""f = io.StringIO(data)  # data loadingfor r in f:     row = r.rstrip()     if 'name_it' in row:         change = row[row.index('name_it')] # maybe kind of len() or something    if "<data>" in row and change:         idx = row.index("<data>") + 6        new += row[:idx] + change + "name_it=\n"        change = ""      else:        new += row + "\n" # new line这是真正的 XML 数据:<?xml version="1.0" encoding="UTF-8"?><testsuite name="Setup">    <testcase classname="Configuration" name="xxx">        <data>abc_qwe</data>                       #change_me_to_"xxx"    </testcase>    <testcase classname="Configuration" name="yyy">        <data>xyzzzz</data>                        #change_me_to_"yyy"    </testcase></testsuite>有很多迹象。名字<data>...</data>应该在name="..."
查看完整描述

1 回答

?
神不在的星期二

TA贡献1963条经验 获得超6个赞

以下:


import xml.etree.ElementTree as ET


xml = '''<testsuite name="Setup">

    <testcase classname="Configuration" name="xxx">

        <data>abc_qwe</data>                      

    </testcase>

    <testcase classname="Configuration" name="yyy">

        <data>xyzzzz</data>                       

    </testcase>

</testsuite>'''



root = ET.fromstring(xml)

test_cases = root.findall('.//testcase')

for test_case in test_cases:

    test_case.find('./data').text = test_case.attrib['name']

    

ET.dump(root)

输出


<testsuite name="Setup">

    <testcase classname="Configuration" name="xxx">

        <data>xxx</data>                      

    </testcase>

    <testcase classname="Configuration" name="yyy">

        <data>yyy</data>                       

    </testcase>

</testsuite>

另一种方式(用数据文本设置name属性的值)


import xml.etree.ElementTree as ET


xml = '''<testsuite name="Setup">

    <testcase classname="Configuration" name="xxx">

        <data>data_1</data>                      

    </testcase>

    <testcase classname="Configuration" name="yyy">

        <data>data_2</data>                       

    </testcase>

</testsuite>'''



root = ET.fromstring(xml)

test_cases = root.findall('.//testcase')

for test_case in test_cases:

    test_case.attrib['name'] = test_case.find('./data').text

    

ET.dump(root)


查看完整回答
反对 回复 2023-05-09
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信