Skip to content

Inconsistent XmlEntityInfo Handling with Multiple Annotated Metadata #274

@lclbm

Description

@lclbm
from typing import Annotated

from pydantic import Field
from pydantic_xml import BaseXmlModel, attr

from pydantic.fields import FieldInfo
from pydantic_xml.fields import XmlEntityInfo


class Node(BaseXmlModel):
    name1: Annotated[str, attr(serialization_alias="A"), Field(default="1")]
    name2: Annotated[str, attr(serialization_alias="A"), attr(default="5")]
    name3: Annotated[str, attr(serialization_alias="A")] = attr(default="3")
    name4: Annotated[str, attr(serialization_alias="A")]


assert all(isinstance(Node.model_fields[f"name{i}"], FieldInfo) for i in range(1, 4))
assert isinstance(Node.model_fields["name4"], XmlEntityInfo)
...

pydantic==2.11.5
pydantic-xml==2.17.1

Hi @dapper91 , I've encountered an issue with Annotated metadata handling in pydantic-xml. Regardless of whether multiple metadata entries are FieldInfo, XmlEntityInfo, or a mix of both, the presence of more than one metadata annotation consistently causes XmlEntityInfo to be incorrectly overridden by FieldInfo in attribute field definitions.

When a field uses Annotated with a single attr metadata, Pydantic's merge_field_infos correctly returns a copy of XmlEntityInfo.
However, when a field contains two or more metadata entries, merge_field_infos erroneously returns Pydantic's standard FieldInfo type instead.
This causes XML attribute fields to be incorrectly typed when multiple metadata annotations are present.

https://github.com/pydantic/pydantic/blob/v2.11.5/pydantic/fields.py#L471

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions