xsdaata with pydantic works but using the classes manually aint a good idea
This commit is contained in:
125
src/main.py
125
src/main.py
@@ -28,59 +28,8 @@ def validate_dataclass_patterns(obj) -> None:
|
|||||||
validate_dataclass_patterns(item)
|
validate_dataclass_patterns(item)
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
# Success - just use object() since it's defined as Optional[object]
|
# Success - use None instead of object() for cleaner XML output
|
||||||
success = object()
|
success = None
|
||||||
|
|
||||||
# Now we need to create the missing nested classes that aren't fully defined
|
|
||||||
# Let's create minimal implementations for the empty classes
|
|
||||||
|
|
||||||
# Create basic implementations for the empty nested classes
|
|
||||||
class RoomType(ab.BaseModel):
|
|
||||||
room_type_code: str = "A"
|
|
||||||
room_classification_code: str = "5"
|
|
||||||
room_type: str = "8"
|
|
||||||
|
|
||||||
class GuestCount(ab.BaseModel):
|
|
||||||
count: int = 1
|
|
||||||
|
|
||||||
class TimeSpanImpl(ab.BaseModel):
|
|
||||||
start: str
|
|
||||||
end: str
|
|
||||||
|
|
||||||
class PersonName(ab.BaseModel):
|
|
||||||
given_name: str
|
|
||||||
surname: str
|
|
||||||
|
|
||||||
class Customer(ab.BaseModel):
|
|
||||||
language: str = "de"
|
|
||||||
gender: str = "Male" # Use valid gender
|
|
||||||
person_name: PersonName
|
|
||||||
|
|
||||||
class Profile(ab.BaseModel):
|
|
||||||
customer: Customer
|
|
||||||
|
|
||||||
class ProfileInfo(ab.BaseModel):
|
|
||||||
profile: Profile
|
|
||||||
|
|
||||||
class Profiles(ab.BaseModel):
|
|
||||||
profile_info: ProfileInfo
|
|
||||||
|
|
||||||
class ResGuest(ab.BaseModel):
|
|
||||||
profiles: Profiles
|
|
||||||
|
|
||||||
class HotelReservationId(ab.BaseModel):
|
|
||||||
res_id_type: str
|
|
||||||
res_id_source_context: str
|
|
||||||
res_id_value: str
|
|
||||||
res_id_source: str
|
|
||||||
|
|
||||||
# Build the structure using the Pydantic models
|
|
||||||
person_name = PersonName(given_name="Otto", surname="Mustermann")
|
|
||||||
customer = Customer(person_name=person_name)
|
|
||||||
profile = Profile(customer=customer)
|
|
||||||
profile_info = ProfileInfo(profile=profile)
|
|
||||||
profiles = Profiles(profile_info=profile_info)
|
|
||||||
res_guest = ResGuest(profiles=profiles)
|
|
||||||
|
|
||||||
# UniqueID
|
# UniqueID
|
||||||
unique_id = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.UniqueId(
|
unique_id = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.UniqueId(
|
||||||
@@ -88,28 +37,70 @@ def main():
|
|||||||
id="6b34fe24ac2ff811"
|
id="6b34fe24ac2ff811"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# TimeSpan - use the actual nested class
|
||||||
|
time_span = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays.RoomStay.TimeSpan()
|
||||||
|
|
||||||
|
# RoomStay with TimeSpan
|
||||||
|
room_stay = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays.RoomStay(
|
||||||
|
time_span=time_span
|
||||||
|
)
|
||||||
|
room_stays = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.RoomStays(
|
||||||
|
room_stay=[room_stay]
|
||||||
|
)
|
||||||
|
|
||||||
|
profile = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGuests.ResGuest.Profiles.ProfileInfo.Profile(
|
||||||
|
customer=ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGuests.ResGuest.Profiles.ProfileInfo.Profile.Customer(
|
||||||
|
person_name=ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGuests.ResGuest.Profiles.ProfileInfo.Profile.Customer.PersonName(
|
||||||
|
given_name="John",
|
||||||
|
surname="Doe"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Use the actual nested Profiles class
|
||||||
|
|
||||||
|
|
||||||
|
profile_info = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGuests.ResGuest.Profiles.ProfileInfo(
|
||||||
|
profile=profile)
|
||||||
|
|
||||||
|
profiles = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGuests.ResGuest.Profiles(profile_info=profile_info)
|
||||||
|
|
||||||
|
# ResGuest
|
||||||
|
res_guest = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGuests.ResGuest(
|
||||||
|
profiles=profiles
|
||||||
|
)
|
||||||
|
res_guests = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGuests(
|
||||||
|
res_guest=res_guest
|
||||||
|
)
|
||||||
|
|
||||||
|
# Use the actual nested HotelReservationIds class
|
||||||
|
hotel_res_ids = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo.HotelReservationIds(
|
||||||
|
hotel_reservation_id=[]
|
||||||
|
)
|
||||||
|
|
||||||
# Basic property info
|
# Basic property info
|
||||||
basic_property_info = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo.BasicPropertyInfo(
|
basic_property_info = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo.BasicPropertyInfo(
|
||||||
hotel_code="123",
|
hotel_code="123",
|
||||||
hotel_name="Frangart Inn"
|
hotel_name="Frangart Inn"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Build a minimal reservation structure
|
# ResGlobalInfo
|
||||||
|
res_global_info = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo(
|
||||||
|
hotel_reservation_ids=hotel_res_ids,
|
||||||
|
basic_property_info=basic_property_info
|
||||||
|
)
|
||||||
|
|
||||||
|
# Hotel Reservation
|
||||||
hotel_reservation = ab.OtaResRetrieveRs.ReservationsList.HotelReservation(
|
hotel_reservation = ab.OtaResRetrieveRs.ReservationsList.HotelReservation(
|
||||||
create_date_time=datetime.now(timezone.utc).isoformat(),
|
create_date_time=datetime.now(timezone.utc).isoformat(),
|
||||||
res_status=ab.HotelReservationResStatus.REQUESTED,
|
res_status=ab.HotelReservationResStatus.REQUESTED,
|
||||||
room_stay_reservation="true",
|
room_stay_reservation="true",
|
||||||
unique_id=unique_id
|
unique_id=unique_id,
|
||||||
|
room_stays=room_stays,
|
||||||
|
res_guests=res_guests,
|
||||||
|
res_global_info=res_global_info
|
||||||
)
|
)
|
||||||
|
|
||||||
# Add the basic property info to res_global_info
|
|
||||||
res_global_info = ab.OtaResRetrieveRs.ReservationsList.HotelReservation.ResGlobalInfo(
|
|
||||||
basic_property_info=basic_property_info
|
|
||||||
)
|
|
||||||
|
|
||||||
# Update the hotel reservation with all required fields
|
|
||||||
hotel_reservation.res_global_info = res_global_info
|
|
||||||
|
|
||||||
reservations_list = ab.OtaResRetrieveRs.ReservationsList(hotel_reservation=[hotel_reservation])
|
reservations_list = ab.OtaResRetrieveRs.ReservationsList(hotel_reservation=[hotel_reservation])
|
||||||
|
|
||||||
# Root element
|
# Root element
|
||||||
@@ -135,7 +126,10 @@ def main():
|
|||||||
)
|
)
|
||||||
|
|
||||||
serializer = XmlSerializer(config=config)
|
serializer = XmlSerializer(config=config)
|
||||||
xml_string = serializer.render(ota_res_retrieve_rs)
|
|
||||||
|
# Use ns_map to control namespace prefixes - set default namespace
|
||||||
|
ns_map = {None: "http://www.opentravel.org/OTA/2003/05"}
|
||||||
|
xml_string = serializer.render(ota_res_retrieve_rs, ns_map=ns_map)
|
||||||
|
|
||||||
with open('output.xml', 'w', encoding='utf-8') as outfile:
|
with open('output.xml', 'w', encoding='utf-8') as outfile:
|
||||||
outfile.write(xml_string)
|
outfile.write(xml_string)
|
||||||
@@ -156,12 +150,11 @@ def main():
|
|||||||
|
|
||||||
parsed_result = parser.from_string(xml_content, ab.OtaResRetrieveRs)
|
parsed_result = parser.from_string(xml_content, ab.OtaResRetrieveRs)
|
||||||
print("✅ Round-trip validation successful!")
|
print("✅ Round-trip validation successful!")
|
||||||
print(f"Parsed reservation status: {parsed_result.res_status}")
|
print(f"Parsed reservation status: {parsed_result.reservations_list.hotel_reservation[0].res_status}")
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"❌ Validation/Serialization failed: {e}")
|
print(f"❌ Validation/Serialization failed: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
main()
|
main()
|
||||||
@@ -1,12 +1,33 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ns0:OTA_ResRetrieveRS xmlns:ns0="http://www.opentravel.org/OTA/2003/05" Version="7.000">
|
<OTA_ResRetrieveRS xmlns="http://www.opentravel.org/OTA/2003/05" Version="7.000">
|
||||||
<ns0:Success><object object at 0x7fd2fa5a0f40></ns0:Success>
|
<ReservationsList>
|
||||||
<ns0:ReservationsList>
|
<HotelReservation CreateDateTime="2025-09-24T09:16:59.563720+00:00" ResStatus="Requested" RoomStayReservation="true">
|
||||||
<ns0:HotelReservation CreateDateTime="2025-09-24T08:56:11.806672+00:00" ResStatus="Requested" RoomStayReservation="true">
|
<UniqueID Type="14" ID="6b34fe24ac2ff811"/>
|
||||||
<ns0:UniqueID Type="14" ID="6b34fe24ac2ff811"/>
|
<RoomStays>
|
||||||
<ns0:ResGlobalInfo>
|
<RoomStay>
|
||||||
<ns0:BasicPropertyInfo HotelCode="123" HotelName="Frangart Inn"/>
|
<TimeSpan/>
|
||||||
</ns0:ResGlobalInfo>
|
</RoomStay>
|
||||||
</ns0:HotelReservation>
|
</RoomStays>
|
||||||
</ns0:ReservationsList>
|
<ResGuests>
|
||||||
</ns0:OTA_ResRetrieveRS>
|
<ResGuest>
|
||||||
|
<Profiles>
|
||||||
|
<ProfileInfo>
|
||||||
|
<Profile>
|
||||||
|
<Customer>
|
||||||
|
<PersonName>
|
||||||
|
<GivenName>John</GivenName>
|
||||||
|
<Surname>Doe</Surname>
|
||||||
|
</PersonName>
|
||||||
|
</Customer>
|
||||||
|
</Profile>
|
||||||
|
</ProfileInfo>
|
||||||
|
</Profiles>
|
||||||
|
</ResGuest>
|
||||||
|
</ResGuests>
|
||||||
|
<ResGlobalInfo>
|
||||||
|
<HotelReservationIDs/>
|
||||||
|
<BasicPropertyInfo HotelCode="123" HotelName="Frangart Inn"/>
|
||||||
|
</ResGlobalInfo>
|
||||||
|
</HotelReservation>
|
||||||
|
</ReservationsList>
|
||||||
|
</OTA_ResRetrieveRS>
|
||||||
|
|||||||
Reference in New Issue
Block a user