2016-12-07 22 views
1

私はxmlファイルがあります。解析XML:複数の同じ属性

<movie title="Enemy Behind"> 
     <type>War, Thriller</type> 
     <type>WW2</type> 
     <format>DVD</format> 
     <year>2003</year> 
     <rating>PG</rating> 
     <stars>10</stars> 
     <description>Talk about a US-Japan war</description> 
    </movie> 

そして、私はPythonで、このXMLを解析するには、次のコードを使用しています:

 Print detail of each movie. 
    for movie in movies: 
     print ("*****Movie*****") 
     if movie.hasAttribute("title"): 
      print ("Title: %s" % movie.getAttribute("title")) 

     type = movie.getElementsByTagName('type')[0] 
     print ("Type: %s" % type.childNodes[0].data) 
     format = movie.getElementsByTagName('format')[0] 
     print ("Format: %s" % format.childNodes[0].data) 
     rating = movie.getElementsByTagName('rating')[0] 
     print ("Rating: %s" % rating.childNodes[0].data) 
     description = movie.getElementsByTagName('description')[0] 
     print ("Description: %s" % description.childNodes[0].data) 

しかし、これだけのコードを使用して属性の1つ、すなわち「戦争、スリラー」が印刷されます。 「WW2」という他の属性は印刷されません。

forループを使用する必要がありますか?私はそれを試して、エラーが発生する "'要素'オブジェクトは反復可能ではありません"。

+0

これは何を示していますか?プリントタイプ(movie.getElementsByTagName( 'type')) – Bemmu

答えて

2

私はあなたが使用しているライブラリを知りませんが、以下のコードでXMLスニペットの値を取得することができます。

のtest.xml

<movie title="Enemy Behind"> 
     <type>War, Thriller</type> 
     <type>WW2</type> 
     <format>DVD</format> 
     <year>2003</year> 
     <rating>PG</rating> 
     <stars>10</stars> 
     <description>Talk about a US-Japan war</description> 
    </movie> 

test.py

import lxml.etree 

# Getting the XML root tag... Movie in our case 
root = lxml.etree.parse("test.xml").getroot() 

# the method "get" returns the value of the XML attribute informed 
# as parameter 
print(root.get("title")) 

# You can iterate over the children of an XML node 
for child in root: 
    print(child.text) # gets the text value from the children XML nodes 

# Or more specifically, for each type, use the method FIND to get 
# the XML child node from the current XML node. 
node = root.find("name") 
if node is not None: 
    print(node.text) 

# ..Or if you expect more than one node, as it is the case for the tag 
# "type", you can use FINDALL which returns all direct children from the current XML node. 
nodes = root.findall("type") 
for node in nodes: 
    print(node.text) 

推奨読書:

+0

メイト私はあなたが私に送られたチュートリアルを見ています、彼らはとてもいいようです。私は自分のやり方を考案しようとしています。すぐに私が使ったものを掲載します。 –

+0

@NikhileshSharma私が投稿したコードスニペットは助けてくれるはずですが、参照を読んでいることを強くお勧めします:)もし私が何らかの方法であなたを助けたと思えば、私の答えをupvoting/acceptを考えてください:) –

+0

メイト私は別のものを試していました。そのために新しい投稿をしてください。 –

関連する問題