2016-05-05 6 views
0

を使用してPythonでネストした要素を解析する方法: は、私がdexmlを使用して、次のXMLを解析しようとしていますdexml

<ticketDetail> 
     <ticketId>int</ticketId> 
..... 
     </ticketDetail> 
     <participants> 
     <ParticipantDetailExt> 
      <participantId>int</participantId> 
... 
     </ParticipantDetailExt> 
     <ParticipantDetailExt> 
      <participantId>int</participantId> 
... 
     </ParticipantDetailExt> 
     </participants> 

マイモデル

次のとおりです。

# Participant Class 
class Participant(dexml.Model): 
    class meta: 
     tagname = "ParticipantDetailExt" 

    participantId = fields.Integer(tagname='participantId') 
... 

# Ticket Class 
class Ticket(dexml.Model): 
    class meta: 
     namespace = "Namespace Here" 
     tagname = "ticketDetail" 

    ticketId = fields.String(tagname='ticketId') 
    ... 
    participants = fields.List(Participant) 

をしかし、しばらくしているすべての要素ネストされたパースが正しく行われていないと、参加者は解析されずにオブジェクト構造にロードされます。どのようにdexmlを使ってこのタイプの構造をモデル化できますか?ここで

はサンプルコードです:

participants = fields.List(Participant, tagname="participants") 

サンプルプログラム:tagnameあなたList()に追加

#!/usr/bin/env python3 

import xml.etree.ElementTree as ET 
import dexml 
from dexml import fields 

samplexml = """<ticketDetail> 
    <ticketId>1</ticketId> 
    <participants> 
    <ParticipantDetailExt> 
     <participantId>2</participantId> 
    </ParticipantDetailExt> 
    <ParticipantDetailExt> 
     <participantId>3</participantId> 
    </ParticipantDetailExt> 
    </participants> 
</ticketDetail>""" 

class Participant(dexml.Model): 
    class meta: 
     tagname = "ParticipantDetailExt" 

    participantId = fields.Integer(tagname='participantId') 

class Ticket(dexml.Model): 
    class meta: 
     tagname = "ticketDetail" 

    ticketId = fields.String(tagname='ticketId') 
    participants = fields.List(Participant) 


myTk = Ticket.parse(samplexml) 
print(myTk.ticketId) 
print(len(myTk.participants)) 

Output is: 
1 
0 

Expected Output would be: 
1 
2 
+0

を短く、**完全なを提供してください**エラーを示すプログラム。プログラムを実行するために必要なすべてのデータを含めてください。あなたの質問にあなたのプログラムをコピーして、期待どおりの出力と実際の出力を貼り付けてください。詳細は、[mcve]を参照してください。 –

+0

''はXMLの* end *に表示されませんか? –

+0

ロブ、私はそれを無視してコピーしますか? – moderndba

答えて

0

てみ

import dexml 
from dexml import fields 

# Participant Class 
class Participant(dexml.Model): 
    class meta: 
     tagname = "ParticipantDetailExt" 

    participantId = fields.Integer(tagname='participantId') 


# Ticket Class 
class Ticket(dexml.Model): 
    class meta: 
     #namespace = "Namespace Here" 
     tagname = "ticketDetail" 

    ticketId = fields.String(tagname='ticketId') 
    participants = fields.List(Participant, tagname="participants") 

t = Ticket.parse(''' 
<ticketDetail> 
     <ticketId>int</ticketId> 
     <participants> 
     <ParticipantDetailExt> 
      <participantId>42</participantId> 
     </ParticipantDetailExt> 
     <ParticipantDetailExt> 
      <participantId>74</participantId> 
     </ParticipantDetailExt> 
     </participants> 
     </ticketDetail> 
''') 

assert len(t.participants) == 2 
+0

ありがとう!そのトリックをした。 – moderndba

関連する問題