dapper91 / pydantic-xml

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

model do not fetch all fields #113

Closed shevernitskiy closed 9 months ago

shevernitskiy commented 9 months ago

I have these models:

class EnumItem(BaseXmlModel, tag="enum-item"):
    name: str = attr(name="name")
    value: int | None = attr(name="value", default=None)
    comment: str = attr(name="comment", default="")

class EnumField(BaseXmlModel, tag="enum"):
    name: str = attr(name="name")
    type_name: str = attr(name="type-name", default="")
    base_type: str = attr(name="base-type", default="")

    items: list[EnumItem] = element(tag="enum-item")

class String(BaseXmlModel):
    name: str = attr(name="name")

class Integer(BaseXmlModel):
    name: str = attr(name="name")

class Pointer(BaseXmlModel, tag="pointer"):
    name: str = attr(name="name")

class Vector(BaseXmlModel):
    name: str = attr(name="name")
    type_name: str = attr(name="type-name", default="")
    pointer_type: str = attr(name="pointer-type", default="")

class Struct(BaseXmlModel, tag="struct-type"):
    type_name: str = attr(name="type-name", default="")

    string: list[String] = element(tag="stl-string", default=[])
    int32_t: list[Integer] = element(tag="int32_t", default=[])
    int16_t: list[Integer] = element(tag="int16_t", default=[])
    int8_t: list[Integer] = element(tag="int8_t", default=[])

    enum: list[EnumField] = element(tag="enum", default=[])
    vector: list[Vector] = element(tag="stl-vector", default=[])
    pointer: list[Pointer] = element(tag="pointer", default=[])

And I'm trying to parse this xml

<struct-type type-name='conversation'>
    <stl-string name='conv_title'/>
    <enum base-type='int32_t' name='state'>
        <enum-item name='started'/>
        <enum-item name='active'/>
        <enum-item name='finished'/>
        <enum-item name='quit'/>
    </enum>
    <stl-vector type-name='int16_t' name='talk_choices' />

    <int32_t name='unk_30' ref-target='unit'/>
    <int32_t name='unk_34' ref-target='historical_figure'/>
    <int32_t name='unk_38'/>

    <int32_t name='unk_3c' ref-target='unit'/>
    <int32_t name='unk_40' ref-target='historical_figure'/>
    <int32_t name='unk_44'/>

    <int32_t name='unk_48' ref-target='unit'/>
    <int32_t name='unk_4c' ref-target='historical_figure'/>
    <int32_t name='unk_50'/>

    <stl-vector name='unk_54' pointer-type='nemesis_record'/>
    <stl-vector name='unk_64' pointer-type='historical_entity'/>
    <int8_t name='unk_74'/>
    <int32_t name='unk_78'/>
    <int32_t name='unk_7c'/>
    <int16_t name='unk_80'/>
    <stl-vector name='unk_84'/>
    <stl-vector name='unk_94'/>
    <stl-vector name='unk_a4'/>
    <pointer name='location' type-name='building' comment='civzone'/>
    <int8_t name='unk_b8'/>
    <int32_t name='unk_bc'/>
    <stl-vector name='speech'>
        <pointer>
            <stl-vector name='text' pointer-type='stl-string' comment='wordwrap'/>
            <int32_t name='speaker' ref-target='unit'/>
            <int32_t name='unk_14'/>
            <int32_t name='unk_18'/>
            <int16_t name='fg'/>
            <int16_t name='bg'/>
            <int16_t name='bright'/>
        </pointer>
    </stl-vector>
</struct-type>

And i have this result:

Struct(
    type_name='conversation',
    string=[String(name='conv_title')],
    int32_t=[],
    int16_t=[],
    int8_t=[],
    enum=[
        EnumField(
            name='state',
            type_name='',
            base_type='int32_t',
            items=[
                EnumItem(name='started', value=None, comment=''),
                EnumItem(name='active', value=None, comment=''),
                EnumItem(name='finished', value=None, comment=''),
                EnumItem(name='quit', value=None, comment='')
            ]
        )
    ],
    vector=[Vector(name='talk_choices', type_name='int16_t', pointer_type='')],
    pointer=[]
)

Somehow parsing stoped after first stl-vector tag. There is no errors.

Python 3.11

shevernitskiy commented 9 months ago

Ok, seems like i should use another search mode