2017-04-16 47 views
0

我想遍历和元素的子元素并检查它们的属性。如果缺少某个属性值,它应该附加一个带有该属性值的空元素。检查xml属性并用Python追加元素3.4

所以这样的:

<app>   
    <rdg wit="#W_1956">Im Restaurant </rdg>    
    <rdg wit="#W_2002">Im Restaurant </rdg> 
    <rdg wit="#W_2010">Im Restaurant </rdg> 
</app> 

我要添加元素

<rdg wit="#W_1999"/> 

我的Python代码如下所示:

for app in root.findall('app'): 
    if '#W_1956' not in ET.Element('rdg').attrib: 
     new_tag = ET.SubElement(app, 'rdg') 

     new_tag.attrib['wit'] = '#W_1956' 
    if '#W_1999' not in ET.Element('rdg').attrib: 
     new_tag = ET.SubElement(app, 'rdg') 

     new_tag.attrib['wit'] = '#W_1999' 

这给了我这个XML:

<app>   
    <rdg wit="#W_1956">Im Restaurant </rdg> 
    <rdg wit="#W_2002">Im Restaurant </rdg> 
    <rdg wit="#W_2010">Im Restaurant </rdg> 
    <rdg wit="#W_1956"/> 
    <rdg wit="#W_1999"/> 
</app> 

因此,即使源代码中存在具有W_1956属性的元素,它仍然会添加它。我也尝试过findall('rdg'),但这也不起作用(输出XML保持完全不变)。现在我不知道错误是在if语句中,elementree(子)元素中的某处还是代码完全错误。

回答

0

尝试使用显式属性。例如:

. 
. 
. 
if '#W_1956' not in ET.Element('rdg').attrib['wit'] 
. 
. 
. 
0

考虑有条件地保存到不同的列表,从文档的整个的rgd属性列表检查。然后,迭代检查值以添加或不添加新元素,全部使用etree的解析将XML属性呈现为具有键/值对的Python字典的事实。

import xml.etree.ElementTree as ET 

txt ='''<app>   
    <rdg wit="#W_1956">Im Restaurant </rdg>    
    <rdg wit="#W_2002">Im Restaurant </rdg> 
    <rdg wit="#W_2010">Im Restaurant </rdg> 
</app>''' 

root = ET.fromstring(txt) 

# LIST OF ALL ATTRIBUTE DICTS 
attrdict = [app.attrib for app in root.findall('./rdg')] 
# LIST OF ALL ATTRIBUTE VALUES 
attrvals = [v for i in attrdict for k,v in i.items()] 

# ITERATE THROUGH ATTRIB VALUES AND ADD TO ROOT IF DOES NOT EXIST 
for i in ['#W_1956', '#W_1999']: 
    if i not in attrvals: 
     new_tag = ET.SubElement(root, 'rdg') 
     new_tag.attrib['wit'] = i 

# OUTPUT TO STRING 
print(ET.tostring(root).decode('UTF-8')) 
# <app>   
# <rdg wit="#W_1956">Im Restaurant </rdg>    
# <rdg wit="#W_2002">Im Restaurant </rdg> 
# <rdg wit="#W_2010">Im Restaurant </rdg> 
# <rdg wit="#W_1999" /></app> 

# OUTPUT TO FILE 
ET.ElementTree(root).write('myoutput.xml', encoding="UTF-8", xml_declaration=True) 
+0

谢谢你,但这种增加在根的RDG标签不作为应用程序标签 ' 的孩子...... ' – Ilkar

+0

仔细一看。 etree输出在最后不能很好地压缩缩进,但标签被添加到* app *的子元素中。 – Parfait