Безопасное получение значения дочернего узла minidom XML

#python #xml #minidom

#python #xml #minidom

Вопрос:

Я впервые использую Python и minidom и хочу получить значение из элемента, что-то вроде:

 <test>value</test>
  

Это прекрасно и просто, но если значение пустое или элемент не существует, тогда я хочу вернуться к значению по умолчанию. Я не смог найти простого способа сделать это на Python, поэтому в итоге написал следующую функцию:

 def getXmlValue(address, default):
   """Return XML node value if available, otherwise return a default"""

   # If the xml element is empty then we get an IndexError exception,
   # if the xml element is missing then the 'if' statement is false
   if address:
      try:
         return address[0].childNodes[0].nodeValue
      except IndexError:
         return default

   return default
  

Для вызова этого я использую что-то вроде:

 test = getXmlValue(node.getElementsByTagName('test'), '666')
  

Это выполняет свою работу и, похоже, работает нормально, но не кажется таким уж эффективным или элегантным.

Есть ли лучший способ сделать это или с этим что-то не так?

Комментарии:

1. Это выглядит совершенно разумным способом получения значения без ошибок.

Ответ №1:

Если вы используете ElementTree , это должно быть намного проще.

 from xml.etree.ElementTree import ElementTree, fromstring

xml = '<test>value</test>'
root = fromstring(xml)
test = root.text or '666'
  

Ответ №2:

поскольку дочерние узлы будут представлять собой массив, как насчет того, чтобы просто выполнить проверку длины и принять иное решение. в некоторых моих кодах у меня есть что-то вроде приведенного ниже. Если childNode.length > 0, то я присваиваю данные childNode[0], в противном случае просто пустую строку.

                 my_element = alertitem.getElementsByTagName('solution')[0]
                result.mydata= my_element.childNodes[0].data if my_element.childNodes.length > 0 else ''
  

для меня это кажется лучше, чем попытка, за исключением.