检查xml属性&;使用Python 3.4追加元素

检查xml属性&;使用Python 3.4追加元素,python,xml,python-3.x,elementtree,Python,Xml,Python 3.x,Elementtree,我想遍历和元素的子元素并检查它们的属性。如果某个属性值丢失,它应该用该属性值附加一个空元素 为此: <app> <rdg wit="#W_1956">Im Restaurant </rdg> <rdg wit="#W_2002">Im Restaurant </rdg> <rdg wit="#W_2010">Im Restaurant </rdg&g

我想遍历和元素的子元素并检查它们的属性。如果某个属性值丢失,它应该用该属性值附加一个空元素

为此:

<app>        
    <rdg wit="#W_1956">Im Restaurant </rdg>               
    <rdg wit="#W_2002">Im Restaurant </rdg>
    <rdg wit="#W_2010">Im Restaurant </rdg>
</app>
这给了我这个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>

Im餐厅
Im餐厅
Im餐厅

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

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

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

考虑通过保存到单独的列表中,有条件地从文档的整个
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)
将xml.etree.ElementTree作为ET导入
txt=“”
Im餐厅
Im餐厅
Im餐厅
'''
root=ET.fromstring(txt)
#所有属性dict的列表
attrdict=[root.findall('./rdg')中应用的app.attrib]
#所有属性值的列表
attrvals=[v代表k的属性中的i,v代表i.items()]
#迭代ATTRIB值,如果不存在,则添加到ROOT
在[#W#u 1956'、#W#u 1999']中的i:
如果我不在属性中:
新标签=ET.SubElement(根'rdg')
新标签.attrib['wit']=i
#输出到字符串
打印(ET.tostring(根)。解码('UTF-8'))
#         
#Im餐厅
#Im餐厅
#Im餐厅
# 
#输出到文件
ET.ElementTree(root).write('myoutput.xml',encoding=“UTF-8”,xml\u声明=True)

谢谢,但这会在根目录中添加rdg标记,而不是作为应用程序标记“…”的子项仔细看看。etree输出没有在末尾正确地进行缩进打印,但标记已添加到应用程序的子级。
.
.
.
if  '#W_1956' not in ET.Element('rdg').attrib['wit']
.
.
.
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)