PydanticXML is a Python library that provides a way to convert Pydantic models to XML and vice versa. It is built on top of the Pydantic library and extends it with XML-specific functionality.
- Based on Pydantic 2
- Convert Pydantic models to XML and vice versa
- Support for XML attributes, elements, content, lists.
- Compatible with most Pydantic features (e.g. default values, aliases, validators,
Field
etc.) - Very easy to use. Extends Pydantic's API with only a few methods.
- Has no dependencies other than Pydantic
- Fully tested (almost 100% coverage)
- Supports mypy
You can install PydanticXML with pip:
pip install pydantic-xmlmodel
To use PydanticXML, you need to import the BaseModelXML
class from the pydanticxml
module:
from pydantic_xmlmodel import BaseModelXML
Or if your models is not based on BaseModelXML class you can use these functions:
from pydantic_xmlmodel import model_dump_xml, model_validate_xml
You can define a model by subclassing BaseModelXML
and defining attributes with type annotations:
class AnimalCharacteristics(BaseModelXML):
color: str = "black"
weight: int = 10
is_friendly: bool = True
You can convert a model to XML by calling the model_dump_xml()
method:
class Cat(BaseModelXML):
animal_characteristics: AnimalCharacteristics
name: str = "Kitty"
cat = Cat(animal_characteristics=AnimalCharacteristics())
print(cat.model_dump_xml())
This will output:
<?xml version="1.0" ?><Cat name="Kitty"><AnimalCharacteristics color="black" weight="10" is_friendly="True" /></Cat>
You can convert XML to a model by calling the model_validate_xml()
method:
xml = '<?xml version="1.0" ?><Cat name="Kitty"><AnimalCharacteristics color="black" weight="10" is_friendly="True" /></Cat>'
cat = Cat.model_validate_xml(xml)
print(cat)
This will output:
xml_content=None animal_characteristics=AnimalCharacteristics(xml_content=None, color='black', weight=10, is_friendly=True) name='Kitty'
(Note that the xml_content
attribute is not part of the model. It is used to store the XML content, like this <element> xml_content <other_element /></element>
)