Python ElementTree库

2 投票
2 回答
501 浏览
提问于 2025-04-18 13:58

我在使用ElementTree处理XML配置文件时遇到了一些麻烦。我想要一个简单的方法来找到某个元素的文本,不管它在XML树的哪个位置。根据文档的说法,我应该可以用findtext()来做到这一点,但无论怎么做,我得到的结果都是None。我哪里出错了呢?大家都说在Python中处理XML很简单,可我却一直遇到问题。

configFileName = 'file.xml'

def configSet (x):
if os.path.exists(configFileName):
    tree = ET.parse(configFileName)
    root = tree.getroot()
    return root.findtext(x)

hiTemp = configSet('hiTemp')
print hiTemp

还有这个XML

<configData>
<units>
    <temp>F</temp>
</units>
<pins>
    <lights>1</lights>
    <fan>2</fan>
    <co2>3</co2>
</pins>
<events>
    <airTemps>
        <hiTemp>80</hiTemp>
        <lowTemp>72</lowTemp>
        <hiTempAlarm>84</hiTempAlarm>
    </airTemps>
    <CO2>
        <co2Hi>1500</co2Hi>
        <co2Low>1400</co2Low>
        <co2Alarm>600</co2Alarm>
    </CO2>
</events>
<settings>
    <apikeys>
        <prowl>
            <apikey>None</apikey>
        </prowl>
    </apikeys>
</settings>

期望的结果

80

实际的结果

None

2 个回答

1

你可以使用xpath来找到你想要的元素。

return root.find('./events/airTemps/hiTemp').text

这里有一份简单易懂的文档,可以帮助你理解。

1

findtext 需要一个完整的路径,但你提供的是一个相对路径,所以找不到你想要的元素。

你可以提供一个正确的 xpath,或者修改你的代码。

def configSet(x):
    if os.path.exists(configFileName):
        tree = ET.parse(configFileName)
        root = tree.getroot()
        for e in root.getiterator():
           t = e.findtext(x)
           if t is not None:
               return t

更新 1:

如果你想把所有匹配的文本作为一个列表,代码会有些不同。

def configSet(x):
    matches = []
    if os.path.exists(configFileName):
        tree = ET.parse(configFileName)
        root = tree.getroot()
        for e in root.getiterator():
           t = e.findtext(x)
           if t is not None:
               matches.append(t)
    return matches

撰写回答