【问题标题】:XML parsing problem in Python - cannot find findtextPython 中的 XML 解析问题 - 找不到 findtext
【发布时间】:2011-09-01 15:14:41
【问题描述】:

我尝试用代码解析 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 上看过

How to parse xml in Python on Google App Engine 但我没有得到 (.//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>

【问题讨论】:

  • 能否也提供一下conf.xml文件的内容?

标签: python


【解决方案1】:

elementtree 有使用命名空间标识符的讨厌习惯。我猜你的 xml 文件有命名空间,所以你的搜索应该是这样的:

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

看看this question,有一些方法可以解决这个问题。

/edit:当问题中没有提供 xml 时,我发布了这个答案。

【讨论】:

  • 愚蠢的问题:您确实将我使用的虚拟名称空间替换为元素具有的正确名称空间,对吗?
  • -1 这是一个好习惯,不是坏习惯 (2) 没有命名空间问题
【解决方案2】:

在您的 xml 中,type 不是标签而是属性。 findtext('.//type') 在 xml 中的任何位置查找名为 type 的标记。如果找到,则返回标签的 .text()。在您的 xml 中获取类型。你可以做这样的事情

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

【讨论】:

  • @John Machin。抱歉,约翰,忘记编辑了。应该是 find not findtext
【解决方案3】:

这与命名空间无关。

问题1:type不是标签,它是标签为datalink的元素的attribute

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

你想要的是这样的:

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

输出:

<Element 'datalink' at 0x019D0AB8>
mstp

【讨论】:

    猜你喜欢
    • 2020-04-15
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    相关资源
    最近更新 更多