安全获取minidom XML子节点值

2 投票
2 回答
3037 浏览
提问于 2025-04-16 19:10

我第一次使用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')

这样可以完成任务,效果也不错,但感觉效率和优雅性都不太高。

有没有更好的方法或者我这样做有什么问题吗?

2 个回答

0

因为 childNodes 会是一个数组,所以可以先检查一下它的长度,然后再做决定。在我的一些代码中,我有类似下面的写法。如果 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 ''

我觉得这样比用 try except 更好。

2

如果你使用 ElementTree,那会简单很多。

from xml.etree.ElementTree import ElementTree, fromstring

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

撰写回答