通过索引查找和替换XML属性-Python

通过索引查找和替换XML属性-Python,python,xml,attributes,lxml,elementtree,Python,Xml,Attributes,Lxml,Elementtree,我正在尝试根据索引查找XML属性并将其替换为新值。如果我将属性值本身硬编码到find/replace函数中,我可以替换属性值,但我需要通过索引来替换,特别是对于前两个列出的属性,以及元素的“文本”值。下面是XML,以及我正在使用的脚本、要添加到XML的新值和所需的输出: XML(“foo_bar.XML”) 正文1 文本2 文本3 文本4 文本5 文本6 剧本 将lxml.etree作为ET导入 xml=ET.parse(“C:\\Users\\mdl518\\Desktop\\bar\u

我正在尝试根据索引查找XML属性并将其替换为新值。如果我将属性值本身硬编码到find/replace函数中,我可以替换属性值,但我需要通过索引来替换,特别是对于前两个列出的属性,以及元素的“文本”值。下面是XML,以及我正在使用的脚本、要添加到XML的新值和所需的输出:

XML(“foo_bar.XML”)


正文1
文本2
文本3
文本4
文本5
文本6
剧本

将lxml.etree作为ET导入
xml=ET.parse(“C:\\Users\\mdl518\\Desktop\\bar\u foo.xml”)
tree=xml.getroot()
新值=浮动(100/202)
新值=浮动(200/500)
新值3=浮动(4/44)
新值=浮动(4/1000)
#查找并替换每个“foo”父元素的第一个和第二个“bar”子元素属性值
对于树中的元素。getiterator()
如果元素文本:
elem.text=elem.text.replace(text_1,new_val_1)
如果元素文本:
elem.text=elem.text.replace(text_2,new_val_2)
如果元素文本:
elem.text=elem.text.replace(text_4,new_val_3)
如果元素文本:
elem.text=elem.text.replace(text_5,new_val_4)
打印(元素文本)
期望结果

<?xml version="1.0" encoding="UTF-8"?>
<Overlay
    <foo_1>
        <bar key="value">new_val_1</bar>
        <bar key="value">new_val_2</bar>
        <bar key="value">text</bar>
    </foo_1>
    <foo_2>
        <bar key="value">new_val_3</bar>
        <bar key="value">new_val_4</bar>
        <bar key="value">text</bar>
    </foo_2>
</Overlay>



考虑元素级循环,
zip
,在所需值和
iterfind
生成器的列表中。运行嵌套循环以对齐元素集和值集。此外,由于每个XML元素都有一个底层文本节点(空或非空),因此不需要检查
if elem.text
。如果整个字符串包含
文本
,只需赋值而不是
替换
。注意:
zip
停止短列表上的元素循环:

#值列表
新值=[浮动(100/202)、浮动(200/500)、浮动(4/44)、浮动(4/1000)]
#值的子列表乘以2(将2调整为任何其他数字)
sub_new_vals=[范围(0,len(new_vals),2)内i的新值[i:i+2]
对于nvs,邮政编码中的el(子文件,tree.iterfind('./*'):
#查找并替换第一个和第二个属性值
对于nv,邮政编码中的元素(nvs,el.iterfind('./*'):
#元素属性[“键”]=str(圆形(nv,3))#更新属性值
elem.text=str(圆形(nv,3))#更新元素文本
打印(元素文本)
输出=ET.tostring(树,
encoding=“UTF-8”,
method=“xml”,
xml_声明=True,
漂亮(打印=真实)
打印(输出解码(“utf-8”))
输出

0.495
0.4
0.091
0.004
<?xml version='1.0' encoding='UTF-8'?>
<Overlay>
    <foo_1>
        <bar key="value">0.495</bar>
        <bar key="value">0.4</bar>
        <bar key="value">text_3</bar>
    </foo_1>
    <foo_2>
        <bar key="value">0.091</bar>
        <bar key="value">0.004</bar>
        <bar key="value">text_6</bar>
    </foo_2>
</Overlay>
0.495
0.4
0.091
0.004
0.495
0.4
文本3
0.091
0.004
文本6

请显示所需结果,因为我对您的属性含义感到困惑,因为您没有在代码中显示
元素属性的尝试。我在所需结果中看不到如何使用键属性。嘿,@Parfait,谢谢您的编辑-它工作得非常顺利!很抱歉这么做,但实际上我更新了我的原始问题,询问如何为两组元素/属性执行此操作。同样的逻辑适用吗?再次感谢!!嘿,@Parfait,我对我原来的帖子做了一次(最后一次)更新,以使xml格式更完善,并更清楚地提出当前的问题。当我重新运行编辑时,我得到以下输出:
0.495text\u 1 text\u 2 text\u 3 0.4text\u 4 text\u 5 text\u 6
。0.495和0.4值需要位于“text_1”和“text_4”的位置,但它越来越近了!请参阅编辑运行嵌套循环。谢谢,@Parfait,更新后的嵌套循环工作得非常出色!我会确认这是正确的解决方案,非常感谢!!:)