【问题标题】:Python minidom check element existsPython minidom 检查元素是否存在
【发布时间】:2017-07-25 12:22:24
【问题描述】:

我有一个具有这种结构的 xml 文件:

<?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标签中是否存在每一列,如果不存在我想返回None,所以我写了这段代码:

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)

这不起作用,因为它不会为不存在的元素返回 None 。我得到index error,因为第一个visit不存在grade

我也尝试this solution 使用 hasChild() 但它给出了错误:

 'Element' object has no attribute 'hasChild'

这里有什么想法吗?

【问题讨论】:

    标签: python xml minidom


    【解决方案1】:

    问题:minidom检查元素存在

    使用结果节点列表代替使用索引,例如:

    # 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>')
    

    输出

    <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

    【讨论】:

      【解决方案2】:

      是的,我遇到了同样的问题,好像没有办法检查元素是否存在。

      您可以先使用getElementsByTagName() 按名称获取元素,然后检查NodeList 的长度。例如:

          for xml_txt in test:
              DOMTree = xml.dom.minidom.parseString(xml_txt)
              b = DOMTree.getElementsByTagName('Track')
              if len(b) == 0:
                  continue
              else:
                  b = b[0]
      

      【讨论】:

        猜你喜欢
        • 2018-01-23
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 2012-11-20
        相关资源
        最近更新 更多