получить значение из дочерних узлов с помощью минидома - PullRequest
0 голосов
/ 09 августа 2011

Я очень плохо знаком с XML и пытаюсь извлечь значение из дочерних узлов

from xml.dom import minidom

def Get_ExtList(progName):
    progFile='%s.xml'%progName
    xmldoc = minidom.parse(progFile)
    extList=[]
    rootNode=xmldoc.firstChild
    progNode=rootNode.childNodes[1]
    for fileNodes in progNode.childNodes:
        newList=[]      
        for formatNodes in fileNodes.childNodes:        
            for nodes in formatNodes.childNodes:
                x=nodes.toxml()
                x=' '.join(x.split())
                newList.append(str(x))
        extList.append(newList)     
    print extList

Вывод:

[[], [‘.aaa'], [], [‘.bbb'], [], [‘.ccc'], [], [‘.ddd'], [], [‘.xxx', ‘.yyy'], []]

, но я хочу что-то следующее

[[‘.aaa'], [‘.bbb'],[‘.ccc’],[‘.ddd'],[‘.xxx', ‘.yyy']]

Вот пример файла:

<?xml version="1.0" ?>
<program>
  <progname name="TEST">
    <file>
      <format>
        .aaa
      </format>
    </file>
    <file>
      <format>
        .bbb
      </format>
    </file>
    <file>
      <format>
        .ccc
      </format>
    </file>
    <file>
      <format>
        .ddd
      </format>
    </file>
    <file>
      <format>
        .xxx
      </format>
      <format>
        .yyy
      </format>
    </file>
  </progname>
</program>

Ответы [ 3 ]

1 голос
/ 10 августа 2011

Вы выполняете цикл не только через узлы, которые содержат теги <file> (ELEMENT_NODE тип узла), но также и пробел с отступом (TEXT_NODE тип узла).Например, в этом элементе:

<a>
  <b>c</b>
</a>

Существует три элемента:

  • TEXT_NODE со значением \n__ (пробелы обозначены _)
  • ELEMENT_NODE со значением <b>c</b>
  • TEXT_NODE со значением \n

Если этот файл отформатирован иначе: <a><b>c</b></a> будет только один ELEMENT_NODEinside.

Вы можете, например, пропустить эти узлы:

for fileNodes in progNode.childNodes:    
    if fileNodes.nodeType != fileNodes.ELEMENT_NODE:    
        continue

или проверить, была ли создана newList для правильного узла и добавить его содержимое только для ELEMENT_NODE:

    if fileNodes.nodeType == fileNodes.ELEMENT_NODE:    
        extList.append(newList)         

в противном случае вы получите пустой список [] с добавлением.

0 голосов
/ 09 августа 2011

В этом случае вы можете попытаться обработать список и удалить пустые элементы:

>>> list = [[], ['.inp'], [], ['.mdp'], [], ['.xtc'], [], ['.top'], [], ['.gro', '.pdb'], []]
>>> for i in list:
...   if not i:
...     list.remove(i)
... 
>>> list
[['.inp'], ['.mdp'], ['.xtc'], ['.top'], ['.gro', '.pdb']]
0 голосов
/ 09 августа 2011

Узлы DOM могут быть элементами, текстом или даже комментариями. Также обратите внимание, что toxml не должен использоваться для извлечения текстового содержимого. Вместо этого используйте свойство .data текстовых узлов:

for nodes in formatNodes.childNodes:
    if node.nodeType == node.ELEMENT_NODE:
        tns =(tn.data for tn in node.childNodes if tn.nodeType == node.TEXT_NODE)
        newList.append(''.join(tns).strip())
...