2011-05-25 7 views
1

を見つけることができない私は、私はすべてのXMLファイルを取得resut私は印刷し、それがOKである場合には、コードXML - FINDTEXT

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)常にリターンなし(型と値mstpのタグがあります)。誰も私にこれを助けることができますか? 私はStackOverflowで無駄です

How to parse xml in Python on Google App Engineしかし、私は(.//タイプ)で結果を得ることはありません。 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> 
+0

はあなたにもconf.xmlファイルの内容を提供することはできますか? –

答えて

1

のElementTreeは、名前空間識別子を使用しての嫌な癖があります。私はあなたのxmlファイルが名前空間を持っているので、あなたの検索はこのような何かを見ているだろうと推測:this question

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

を見て、これに対処するには、いくつかの方法があります。

/edit:xmlが質問に記載されていないときに私はこの回答を掲載しました。

+0

試しましたが、まだありません。 –

+0

愚かな質問:私が使用しているダミーの名前空間を、要素が持つ正しい名前空間で置き換えたのですか? –

+1

-1これは良い習慣であり、厄介なものではありません。(2)名前空間の問題がありません。 –

2

xml typeはタグではなく属性です。 findtext('.//type')は、xmlの任意の場所にtypeというタグを探します。見つかった場合は、タグの.text()を返します。あなたのxmlで型を取得します。このようなことをすることができます

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

-1 AttributeError: 'str'オブジェクトに 'get'という属性がありません。 –

+0

@John Machinごめんなさいジョンさん、それを編集するのを忘れました。それはfindtextを見つけるべきではありません –

4

名前空間とは関係ありません。

問題1:typeはタグではなく、タグがdatalinkの要素のattributeです。

問題2:xml.findtext()は、要素のtextコンポーネントを返します。それはあなたが望むものではありません。あなたがしたいですか何

はこれです:

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

出力:

<Element 'datalink' at 0x019D0AB8> 
mstp