Python 中的 XML 解析问题 - 找不到 findtext

1 投票
3 回答
2616 浏览
提问于 2025-04-16 18:18

我尝试用代码解析XML文件。

import urllib2
from xml.etree import ElementTree

if __name__ == '__main__':
    print 'hello'
    result = urllib2.urlopen('http://localhost/conf.xml').read()
    xml = ElementTree.fromstring(result)
    print result
    print xml.findtext('.//type')

当我打印结果时,能看到整个XML文件,这没问题,但最后一行(xml.findtext)总是返回None(我有一个类型为mstp的标签)。有人能帮我解决这个问题吗?我在StackOverflow上查过。

如何在Google App Engine上用Python解析XML,但我用(.//type)没有得到结果。

这是XML文件:

<router>
  <datalink
    type="mstp"
    network="13"
    mac="18"
    hopcount="8">
    <mqueue
      name="/mstp1"
      msgnum="10"
      msgsize="768"
    />
    <mstp
      port="/dev/ttySx"
      baud="9600|19200|38400|76800"
      Nmax_info_frames="1+"
      Nmax_master="127-"
      Npoll="50"
      Nretry_token="1"
      Nmin_octets="4"
      Tframe_abort="60-100"
      Tframe_gap="20"
      Tno_token="500"
      Tpostdrive="15"
      Treply_delay="250"
      Treply_timeout="255-300"
      Troff="29-40"
      Tslot="10"
      Tturnaround="40"
      Tusage_delay="15"
      Tusage_timeout="20-100"
    />
  </datalink>
  <datalink
    type="bip"
    network="12"
    mac="192.168.0.146:47808"
    hopcount="8"
    >
    <mqueue
      name="/bip1"
      msgnum="10"
      msgsize="2048"
    />
    <bip
      bbmd="address|self|none"
      bmask="bmask"
    >
      <bbmd
    edit="yes|no"> <!-- dozvoljeno menjanje tabele -->
    <bdt address="192.168.0.131:0xBAC0:192.168.0.255"/> <!-- adresa:port:bmask -->
    <bdt address="192.168.0.157:0xBAC0:192.168.0.255"/>
      </bbmd>
    </bip>
  </datalink>
  <network
    unavailable="90%"
    available="40%"
    hop-dec="1">
    <mqueue
      name="/network"
      msgnum="40"
      msgsize="2048"
    />
    <!--  -->
    <hrpolicy
      general="ignore|activate|performance|demand"
      performance="num"
      conntime="num"
    />
  </network>
  <application>
    <mqueue
      name="/application"
      msgnum="10"
      msgsize="2048"
    />
  </application>
</router>

3 个回答

1

ElementTree这个库有个让人头疼的习惯,就是使用带命名空间的标识符。我猜你的XML文件里有命名空间,所以你搜索的时候需要这样做:

print xml.findtext('.//{http://really-long-namespace.uri}type')

可以看看这个问题,里面有一些处理这个问题的方法。

/编辑:我在当时回答这个问题的时候,问题里没有提供XML文件。

2

在你的xml文件中,type 不是一个标签,而是一个属性。findtext('.//type') 是在你的xml中寻找名为type的标签。如果找到了,它会返回这个标签的文本内容。要在你的xml中获取type,你可以这样做:

xml = ElementTree.fromstring(result)
datalink = xml.find('.//datalink')
type = datalink.get('type')
4

这和命名空间没有关系。

问题1:type 不是一个标签,它是标签为 datalink 的元素的一个 属性

问题2:xml.findtext() 返回的是元素的 text 部分;这不是你想要的。

你真正想要的是这个:

elem = xml.find(".//datalink")
print repr(elem)
print elem.get("type")

输出:

<Element 'datalink' at 0x019D0AB8>
mstp

撰写回答