2017-07-25 67 views
1

我有这种结构的XML文件:Python的minidom命名检查元素存在

<?DOMParser ?> 
<logbook:LogBook xmlns:logbook="http://www/logbook/1.0" version="1.2"> 
<visits> 
<visit> 
    <general> 
     <technology>EB</technology> 
    </general> 
</visit> 
<visit> 
<general> 
    <grade>23242</grade> 
    <technology>EB</technology> 
</general> 
</visit> 
</visits> 
</logbook:LogBook> 

我要检查,如果在visit标签存在的每一列,如果它不存在,我想回到无,所以我写了这段代码:

import xml.dom.minidom as minidom 
mydict={} 
columnsLst=['grade','technology'] 
doc=minidom.parse('file.xml') 
visitcount=len(doc.getElementsByTagName('visit')) 
for i in range(visitcount): 
    for c in columnsLst: 
     if(doc.getElementsByTagName(c)[i].firstChild): 
     mydict[c]=doc.getElementsByTagName(c)[i].firstChild.data 
    print(mydict) 

这不起作用,因为它对于不存在的元素不返回无。我得到index error,因为grade首先不存在visit

我试图this solution以及使用hasChild(),但它给了错误:

'Element' object has no attribute 'hasChild' 

任何这里的想法?

回答

1

Question: minidom check element exists

代替具有指数fideling的使用产生的NodeLists,例如:

# Get List of Nodes with Tag <visit> 
visits = doc.getElementsByTagName('visit') 

# Iterate NodeList 
for n, visit in enumerate(visits, 1): 
    print('{}:{}'.format(n, visit)) 

    # Get SubNodes with Tag <general> 
    general = visit.getElementsByTagName('general') 

    # First Error Condition 
    if general: 
     # Iterate all Tag Names 
     for subtag in ['grade', 'technology']: 
      # Second Error Condition, assuming only ONE SubNode <general> 
      if not general[0].getElementsByTagName(subtag): 
       print('\tMissing Subtag <{}>'.format(subtag)) 
    else: 
     print('\tMissing Tag <general>') 

Output:

<Element {http://www/logbook/1.0}LogBook at 0xf707f52c> 
1:<DOM Element: visit at 0xf6a6125c> 
    Missing Subtag <grade> 
2:<DOM Element: visit at 0xf6a6184c> 

测试与Python:3.4.2