Как анализировать вложенные элементы в 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?

Вот пример кода:

#!/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

1 ответ

  1. Попробуйте добавить a tagnameк вашему List():

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

    Пример программы:

    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