dapper91 / pydantic-xml

python xml for humans
https://pydantic-xml.readthedocs.io
The Unlicense
155 stars 16 forks source link

Wrapper creates multiple element trees instead of a single one with sibling elements #63

Closed andrewshadura closed 1 year ago

andrewshadura commented 1 year ago

I’m trying to nest a bunch of elements next to each other, but wrapped() keeps creating root elements for each of them.

class Transaction(BaseXmlModel, tag='Ntry'):                  
    ref: str = element(tag='NtryRef')                         
    amount: Decimal = element(tag='Amt')                      
    currency: str = wrapped(                                  
        'Amt',                                                
        attr(name = 'Ccy')                                    
    )                                                         
    val_date: datetime.date = wrapped(                        
        'ValDt/Dt',                                           
    )                                                         
    remote_info: str | None = wrapped(                        
        'NtryDtls/TxDtls/RmtInfUstrd',                        
    )                                                         
    additional_transaction_info: str | None = wrapped(        
        'NtryDtls/TxDtls/AddtlTxInf',                         
    )                                                         
    related_account: str | None = wrapped(                    
        'NtryDtls/TxDtls/RltdPties/DbtrAcct/Id/Othr/Id',      
    )                                                         
    related_account_bank: str | None = wrapped(               
        'NtryDtls/TxDtls/RltdAgts/DbtrAgt/FinInstnId/Othr/Id',
    )                                                         

I need this output:

<NtryDtls>
  <TxDtls>
    <RmtInfUstrd>Foo</RmtInfUstrd>
    <AddtlTxInf>Bar</AddtlTxInf>
    <RltdPties>
      <DbtrAcct>
        <Id>
          <Othr>
            <Id>SK1234</Id>
          </Othr>
        </Id>
      </DbtrAcct>
    </RltdPties>
    <RltdAgts>
      <DbtrAgt>
        <FinInstnId>
          <Othr>
            <Id>SKBX</Id>
          </Othr>
        </FinInstnId>
      </DbtrAgt>
    </RltdAgts>
  </TxDtls>
</NtryDtls>

Instead, this is created:

<NtryDtls>
  <TxDtls>
    <RmtInfUstrd>Foo</RmtInfUstrd>
  </TxDtls>
</NtryDtls>
<NtryDtls>
  <TxDtls>
    <AddtlTxInf>Bar</AddtlTxInf>
  </TxDtls>
</NtryDtls>
<NtryDtls>
  <TxDtls>
    <RltdPties>
      <DbtrAcct>
        <Id>
          <Othr>
            <Id>SK1234</Id>
          </Othr>
        </Id>
      </DbtrAcct>
    </RltdPties>
  </TxDtls>
</NtryDtls>
<NtryDtls>
  <TxDtls>
    <RltdAgts>
      <DbtrAgt>
        <FinInstnId>
          <Othr>
            <Id>SKBX</Id>
          </Othr>
        </FinInstnId>
      </DbtrAgt>
    </RltdAgts>
  </TxDtls>
</NtryDtls>

I’m using this test call:

t = Transaction(
    ref='12345',
    amount='123.45',
    currency='EUR',
    val_date='2023-04-05',
    remote_info='Foo',
    additional_transaction_info='Bar',
    related_account='SK1234',
    related_account_bank='SKBX',
)

I tried wrapping elements in various different ways, and nothing helped.

Thanks in advance!

dapper91 commented 1 year ago

@andrewshadura Hi. That is a bug. Fixed it in version 0.7.0.