Этот код дает желаемый результат:
from xml.dom.minidom import parseString
document = """\
<assetsMain>
<assetParent type='character' shortName='char'>
<asset>
pub
</asset>
<asset>
car
</asset>
</assetParent>
<assetParent type='par' shortName='pr'>
<asset>
camera
</asset>
<asset>
rig
</asset>
</assetParent>
</assetsMain>
"""
def getNestedList():
dom = parseString(document)
li = []
for assetParent in dom.childNodes[0].getElementsByTagName("assetParent"):
# read type and shortName
a = [assetParent.getAttribute("type"), assetParent.getAttribute("shortName")]
# read content of asset nodes
b = [asset.childNodes[0].data.strip() for asset in assetParent.getElementsByTagName("asset")]
# put the lists together in a list and add them to the list (!)
li.append([a,b])
return li
if __name__=="__main__":
print getNestedList()
Обратите внимание, что мы можем выбрать, какие дочерние узлы мы хотим прочитать с помощью getElementsByTagName
. Атрибуты читаются с getAttribute
на узле. Текстовое содержимое внутри узла читается через свойство data
(сам текст также является дочерним узлом). Если вы читаете текст внутри узла, вы можете проверить, что это действительно текст:
if node.nodeType == node.TEXT_NODE:
Также обратите внимание, что здесь нет проверки или обработки ошибок. Узлы, не имеющие дочерних узлов, вызовут IndexError
.
Хотя из-за вложенного списка из трех уровней я хочу предложить вам использовать словари.
Выход:
[[[u'character', u'char'], [u'pub', u'car']], [[u'par', u'pr'], [u'camera', u'rig']]]