How to work with wildcard fields?
==================================
One of the xml schema traits is to support any extensions with wildcards.
.. code-block:: xml
The generator will roughly create this class for you.
.. doctest::
>>> from dataclasses import dataclass
>>> from dataclasses import field
>>> from typing import Dict
>>> from typing import List
...
>>> @dataclass
... class MetadataType:
... any_element: List[object] = field(
... default_factory=list,
... metadata={
... "type": "Wildcard",
... "namespace": "##any",
... }
... )
... other_attributes: Dict[str, str] = field(
... default_factory=dict,
... metadata={
... "type": "Attributes",
... "namespace": "##other",
... }
... )
xsdata comes with two generic models that are used during parsing and you can also use
to generate any custom xml element.
.. list-table::
:widths: 20 250
:header-rows: 1
* - Model
- Description
* - :class:`~xsdata.formats.dataclass.models.generics.AnyElement`
- Used to represent any xml structure, resembles a DOM Element
* - :class:`~xsdata.formats.dataclass.models.generics.DerivedElement`
- Wrapper for type substitution elements eg `...`
.. doctest::
>>> from xsdata.formats.dataclass.models.generics import AnyElement
>>> from xsdata.formats.dataclass.models.generics import DerivedElement
>>> from xsdata.formats.dataclass.serializers import XmlSerializer
>>> from xsdata.formats.dataclass.serializers.config import SerializerConfig
...
>>> obj = MetadataType(
... any_element=[
... AnyElement(
... qname="bar",
... children=[
... AnyElement(qname="first", text="1st", attributes={"a": "1"}),
... AnyElement(qname="second", text="2nd", attributes={"b": "2"}),
... DerivedElement(
... qname="third",
... value=MetadataType(other_attributes={"c": "3"})
... )
... ]
... )
... ]
... )
>>> config = SerializerConfig(pretty_print=True, xml_declaration=False)
>>> serializer = XmlSerializer(config=config)
>>> print(serializer.render(obj))
1st
2nd