Add XML domain and documentation

This change introduces a new FuzzTest domain for generating complex XML strings.
It includes:
- An XML domain implementation (`fuzztest/internal/domains/xml_domain.h`) that uses `DomainBuilder` for recursion and helper domains for tags, attributes, and content.
- An example fuzz test (`examples/xml_fuzz_test.cc`) demonstrating how to use the XML domain.
- A new documentation file (`doc/xml_domain.md`) explaining the design and usage of the XML domain.

The example fuzz test's BUILD file uses `cc_test` as a workaround for potential Bazel issues with `cc_fuzz_test`. The documentation includes a note about this.
diff --git a/.hypothesis/constants/17dd46dc7a458a66 b/.hypothesis/constants/17dd46dc7a458a66
new file mode 100644
index 0000000..545b5aa
--- /dev/null
+++ b/.hypothesis/constants/17dd46dc7a458a66
@@ -0,0 +1,4 @@
+# file: /app/xpath_validator/src/xpath_validator/domain/xml_domain.py
+# hypothesis_version: 6.135.6
+
+['L', 'N', 'P', 'S', 'Z', '__main__', 'a', 'z']
\ No newline at end of file
diff --git a/.hypothesis/constants/da39a3ee5e6b4b0d b/.hypothesis/constants/da39a3ee5e6b4b0d
new file mode 100644
index 0000000..38e5344
--- /dev/null
+++ b/.hypothesis/constants/da39a3ee5e6b4b0d
@@ -0,0 +1,4 @@
+# file: /usr/lib/python3.10/sitecustomize.py
+# hypothesis_version: 6.135.6
+
+[]
\ No newline at end of file
diff --git a/.hypothesis/unicode_data/13.0.0/charmap.json.gz b/.hypothesis/unicode_data/13.0.0/charmap.json.gz
new file mode 100644
index 0000000..a7c6200
--- /dev/null
+++ b/.hypothesis/unicode_data/13.0.0/charmap.json.gz
Binary files differ
diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock
new file mode 100644
index 0000000..43e8b2c
--- /dev/null
+++ b/MODULE.bazel.lock
@@ -0,0 +1,217 @@
+{
+  "lockFileVersion": 18,
+  "registryFileHashes": {
+    "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497",
+    "https://bcr.bazel.build/modules/abseil-py/2.1.0/MODULE.bazel": "5ebe5bf853769c65707e5c28f216798f7a4b1042015e6a36e6d03094d94bec8a",
+    "https://bcr.bazel.build/modules/abseil-py/2.1.0/source.json": "0e8fc4f088ce07099c1cd6594c20c7ddbb48b4b3c0849b7d94ba94be88ff042b",
+    "https://bcr.bazel.build/modules/antlr4-cpp-runtime/4.12.0/MODULE.bazel": "5456a3ccfd57186adf742190961b4aa07aab86f772a3eb4ce241f7254869fc86",
+    "https://bcr.bazel.build/modules/antlr4-cpp-runtime/4.12.0/source.json": "b56033b603cf951d4063c805e8cb48bfa81dc019bd046dbbea7815fdd906a81d",
+    "https://bcr.bazel.build/modules/apple_support/1.11.1/MODULE.bazel": "1843d7cd8a58369a444fc6000e7304425fba600ff641592161d9f15b179fb896",
+    "https://bcr.bazel.build/modules/apple_support/1.13.0/MODULE.bazel": "7c8cdea7e031b7f9f67f0b497adf6d2c6a2675e9304ca93a9af6ed84eef5a524",
+    "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85",
+    "https://bcr.bazel.build/modules/apple_support/1.15.1/source.json": "517f2b77430084c541bc9be2db63fdcbb7102938c5f64c17ee60ffda2e5cf07b",
+    "https://bcr.bazel.build/modules/aspect_bazel_lib/1.31.2/MODULE.bazel": "7bee702b4862612f29333590f4b658a5832d433d6f8e4395f090e8f4e85d442f",
+    "https://bcr.bazel.build/modules/aspect_bazel_lib/1.38.0/MODULE.bazel": "6307fec451ba9962c1c969eb516ebfe1e46528f7fa92e1c9ac8646bef4cdaa3f",
+    "https://bcr.bazel.build/modules/aspect_bazel_lib/1.40.3/MODULE.bazel": "668e6bcb4d957fc0e284316dba546b705c8d43c857f87119619ee83c4555b859",
+    "https://bcr.bazel.build/modules/aspect_bazel_lib/1.40.3/source.json": "f5a28b1320e5f444e798b4afc1465c8b720bfaec7522cca38a23583dffe85e6d",
+    "https://bcr.bazel.build/modules/aspect_rules_js/1.33.1/MODULE.bazel": "db3e7f16e471cf6827059d03af7c21859e7a0d2bc65429a3a11f005d46fc501b",
+    "https://bcr.bazel.build/modules/aspect_rules_js/1.39.0/MODULE.bazel": "aece421d479e3c31dc3e5f6d49a12acc2700457c03c556650ec7a0ff23fc0d95",
+    "https://bcr.bazel.build/modules/aspect_rules_js/1.39.0/source.json": "a8f93e4ad8843e8aa407fa5fd7c8b63a63846c0ce255371ff23384582813b13d",
+    "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/MODULE.bazel": "e767c5dbfeb254ec03275a7701b5cfde2c4d2873676804bc7cb27ddff3728fed",
+    "https://bcr.bazel.build/modules/aspect_rules_lint/0.12.0/source.json": "9a3668e1ee219170e22c0e7f3ab959724c6198fdd12cd503fa10b1c6923a2559",
+    "https://bcr.bazel.build/modules/bazel_features/0.1.0/MODULE.bazel": "47011d645b0f949f42ee67f2e8775188a9cf4a0a1528aa2fa4952f2fd00906fd",
+    "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd",
+    "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8",
+    "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d",
+    "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d",
+    "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a",
+    "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58",
+    "https://bcr.bazel.build/modules/bazel_features/1.21.0/MODULE.bazel": "675642261665d8eea09989aa3b8afb5c37627f1be178382c320d1b46afba5e3b",
+    "https://bcr.bazel.build/modules/bazel_features/1.23.0/MODULE.bazel": "fd1ac84bc4e97a5a0816b7fd7d4d4f6d837b0047cf4cbd81652d616af3a6591a",
+    "https://bcr.bazel.build/modules/bazel_features/1.23.0/source.json": "c72c61b722d7c3f884994fe647afeb2ed1ae66c437f8f370753551f7b4d8be7f",
+    "https://bcr.bazel.build/modules/bazel_features/1.3.0/MODULE.bazel": "cdcafe83ec318cda34e02948e81d790aab8df7a929cec6f6969f13a489ccecd9",
+    "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7",
+    "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b",
+    "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/source.json": "f121b43eeefc7c29efbd51b83d08631e2347297c95aac9764a701f2a6a2bb953",
+    "https://bcr.bazel.build/modules/boringssl/0.0.0-20240530-2db0eb3/MODULE.bazel": "d0405b762c5e87cd445b7015f2b8da5400ef9a8dbca0bfefa6c1cea79d528a97",
+    "https://bcr.bazel.build/modules/boringssl/0.0.0-20240530-2db0eb3/source.json": "0d413869349e82e5d679802abe9ce23e0326bbf56daa97ae9e7dbdcec72982fc",
+    "https://bcr.bazel.build/modules/brotli/1.1.0/MODULE.bazel": "3b5b90488995183419c4b5c9b063a164f6c0bc4d0d6b40550a612a5e860cc0fe",
+    "https://bcr.bazel.build/modules/brotli/1.1.0/source.json": "098a4fd315527166e8dfe1fd1537c96a737a83764be38fc43f4da231d600f3d0",
+    "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84",
+    "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8",
+    "https://bcr.bazel.build/modules/bzip2/1.0.8/MODULE.bazel": "83ee443b286b0b91566e5ee77e74ba6445895f3135467893871560f9e4ebc159",
+    "https://bcr.bazel.build/modules/bzip2/1.0.8/source.json": "b64f3a2f973749cf5f6ee32b3d804af56a35a746228a7845ed5daa31c8cc8af1",
+    "https://bcr.bazel.build/modules/gazelle/0.27.0/MODULE.bazel": "3446abd608295de6d90b4a8a118ed64a9ce11dcb3dda2dc3290a22056bd20996",
+    "https://bcr.bazel.build/modules/gazelle/0.30.0/MODULE.bazel": "f888a1effe338491f35f0e0e85003b47bb9d8295ccba73c37e07702d8d31c65b",
+    "https://bcr.bazel.build/modules/gazelle/0.30.0/source.json": "7af0779f99120aafc73be127615d224f26da2fc5a606b52bdffb221fd9efb737",
+    "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4",
+    "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6",
+    "https://bcr.bazel.build/modules/googletest/1.16.0/MODULE.bazel": "a175623c69e94fca4ca7acbc12031e637b0c489318cd4805606981d4d7adb34a",
+    "https://bcr.bazel.build/modules/googletest/1.16.0/source.json": "dd011b202542efcd4c0e3df34b1558d41598c6f287846728315ded5f7984b77a",
+    "https://bcr.bazel.build/modules/highwayhash/0.0.0-20240305-5ad3bf8/MODULE.bazel": "5c7f29d5bd70feff14b0f65b39584957e18e4a8d555e5a29a4c36019afbb44b9",
+    "https://bcr.bazel.build/modules/highwayhash/0.0.0-20240305-5ad3bf8/source.json": "211c0937ef5f537da6c3c135d12e60927c71b380642e207e4a02b86d29c55e85",
+    "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075",
+    "https://bcr.bazel.build/modules/jsoncpp/1.9.6/MODULE.bazel": "2f8d20d3b7d54143213c4dfc3d98225c42de7d666011528dc8fe91591e2e17b0",
+    "https://bcr.bazel.build/modules/jsoncpp/1.9.6/source.json": "a04756d367a2126c3541682864ecec52f92cdee80a35735a3cb249ce015ca000",
+    "https://bcr.bazel.build/modules/lz4/1.9.4/MODULE.bazel": "e3d307b1d354d70f6c809167eafecf5d622c3f27e3971ab7273410f429c7f83a",
+    "https://bcr.bazel.build/modules/lz4/1.9.4/source.json": "233f0bdfc21f254e3dda14683ddc487ca68c6a3a83b7d5db904c503f85bd089b",
+    "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/MODULE.bazel": "87023db2f55fc3a9949c7b08dc711fae4d4be339a80a99d04453c4bb3998eefc",
+    "https://bcr.bazel.build/modules/nlohmann_json/3.11.3/source.json": "296c63a90c6813e53b3812d24245711981fc7e563d98fe15625f55181494488a",
+    "https://bcr.bazel.build/modules/nlohmann_json/3.6.1/MODULE.bazel": "6f7b417dcc794d9add9e556673ad25cb3ba835224290f4f848f8e2db1e1fca74",
+    "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5",
+    "https://bcr.bazel.build/modules/platforms/0.0.10/source.json": "f22828ff4cf021a6b577f1bf6341cb9dcd7965092a439f64fc1bb3b7a5ae4bd5",
+    "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee",
+    "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37",
+    "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615",
+    "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814",
+    "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d",
+    "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc",
+    "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7",
+    "https://bcr.bazel.build/modules/protobuf/23.1/MODULE.bazel": "88b393b3eb4101d18129e5db51847cd40a5517a53e81216144a8c32dfeeca52a",
+    "https://bcr.bazel.build/modules/protobuf/24.4/MODULE.bazel": "7bc7ce5f2abf36b3b7b7c8218d3acdebb9426aeb35c2257c96445756f970eb12",
+    "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c",
+    "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d",
+    "https://bcr.bazel.build/modules/protobuf/28.3/MODULE.bazel": "2b3764bbab2e46703412bd3b859efcf0322638ed015e88432df3bb740507a1e9",
+    "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df",
+    "https://bcr.bazel.build/modules/protobuf/29.0-rc3/MODULE.bazel": "33c2dfa286578573afc55a7acaea3cada4122b9631007c594bf0729f41c8de92",
+    "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e",
+    "https://bcr.bazel.build/modules/protobuf/29.1/MODULE.bazel": "557c3457560ff49e122ed76c0bc3397a64af9574691cb8201b4e46d4ab2ecb95",
+    "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0",
+    "https://bcr.bazel.build/modules/protobuf/3.19.2/MODULE.bazel": "532ffe5f2186b69fdde039efe6df13ba726ff338c6bc82275ad433013fa10573",
+    "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858",
+    "https://bcr.bazel.build/modules/protobuf/30.2/MODULE.bazel": "6b8b37f8390fbaf9bee5eed558697238082fab658a8a8996328628292ae79d2e",
+    "https://bcr.bazel.build/modules/protobuf/30.2/source.json": "7d7f541c637b49edbefa5aeca2cc365f2e3edac8d75fedb448d68ea003d9ded7",
+    "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e",
+    "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34",
+    "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680",
+    "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206",
+    "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a",
+    "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4",
+    "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa",
+    "https://bcr.bazel.build/modules/riegeli/0.0.0-20241218-3385e3c/MODULE.bazel": "14bbe297ac80b30b689bde824d823f53bd87cd504ec3f82de72a730e7b02d526",
+    "https://bcr.bazel.build/modules/riegeli/0.0.0-20241218-3385e3c/source.json": "c3c4c0524f8afcfd6fbd0d3d212d4589fd9f26635dd0bcf20e5acc87493ab362",
+    "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8",
+    "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e",
+    "https://bcr.bazel.build/modules/rules_apple/3.13.0/MODULE.bazel": "b4559a2c6281ca3165275bb36c1f0ac74666632adc5bdb680e366de7ce845f43",
+    "https://bcr.bazel.build/modules/rules_apple/3.13.0/source.json": "fe31c678e2256daa91a802664b578c1de71dc43a49a7ccc16db001378f312cd3",
+    "https://bcr.bazel.build/modules/rules_buf/0.1.1/MODULE.bazel": "6189aec18a4f7caff599ad41b851ab7645d4f1e114aa6431acf9b0666eb92162",
+    "https://bcr.bazel.build/modules/rules_buf/0.1.1/source.json": "021363d254f7438f3f10725355969c974bb2c67e0c28667782ade31a9cdb747f",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.17/source.json": "4db99b3f55c90ab28d14552aa0632533e3e8e5e9aea0f5c24ac0014282c2a7c5",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e",
+    "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5",
+    "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8",
+    "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e",
+    "https://bcr.bazel.build/modules/rules_go/0.33.0/MODULE.bazel": "a2b11b64cd24bf94f57454f53288a5dacfe6cb86453eee7761b7637728c1910c",
+    "https://bcr.bazel.build/modules/rules_go/0.38.1/MODULE.bazel": "fb8e73dd3b6fc4ff9d260ceacd830114891d49904f5bda1c16bc147bcc254f71",
+    "https://bcr.bazel.build/modules/rules_go/0.39.1/MODULE.bazel": "d34fb2a249403a5f4339c754f1e63dc9e5ad70b47c5e97faee1441fc6636cd61",
+    "https://bcr.bazel.build/modules/rules_go/0.39.1/source.json": "f21e042154010ae2c944ab230d572b17d71cdb27c5255806d61df6ccaed4354c",
+    "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74",
+    "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86",
+    "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39",
+    "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6",
+    "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31",
+    "https://bcr.bazel.build/modules/rules_java/7.1.0/MODULE.bazel": "30d9135a2b6561c761bd67bd4990da591e6bdc128790ce3e7afd6a3558b2fb64",
+    "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a",
+    "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6",
+    "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab",
+    "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2",
+    "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe",
+    "https://bcr.bazel.build/modules/rules_java/8.11.0/MODULE.bazel": "c3d280bc5ff1038dcb3bacb95d3f6b83da8dd27bba57820ec89ea4085da767ad",
+    "https://bcr.bazel.build/modules/rules_java/8.11.0/source.json": "302b52a39259a85aa06ca3addb9787864ca3e03b432a5f964ea68244397e7544",
+    "https://bcr.bazel.build/modules/rules_java/8.3.2/MODULE.bazel": "7336d5511ad5af0b8615fdc7477535a2e4e723a357b6713af439fe8cf0195017",
+    "https://bcr.bazel.build/modules/rules_java/8.5.1/MODULE.bazel": "d8a9e38cc5228881f7055a6079f6f7821a073df3744d441978e7a43e20226939",
+    "https://bcr.bazel.build/modules/rules_java/8.6.1/MODULE.bazel": "f4808e2ab5b0197f094cabce9f4b006a27766beb6a9975931da07099560ca9c2",
+    "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7",
+    "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909",
+    "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036",
+    "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d",
+    "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4",
+    "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0",
+    "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197",
+    "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59",
+    "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3",
+    "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5",
+    "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0",
+    "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d",
+    "https://bcr.bazel.build/modules/rules_license/0.0.8/MODULE.bazel": "5669c6fe49b5134dbf534db681ad3d67a2d49cfc197e4a95f1ca2fd7f3aebe96",
+    "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c",
+    "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb",
+    "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/MODULE.bazel": "6bc03c8f37f69401b888023bf511cb6ee4781433b0cb56236b2e55a21e3a026a",
+    "https://bcr.bazel.build/modules/rules_nodejs/5.8.2/source.json": "6e82cf5753d835ea18308200bc79b9c2e782efe2e2a4edc004a9162ca93382ca",
+    "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
+    "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff",
+    "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a",
+    "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06",
+    "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7",
+    "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483",
+    "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73",
+    "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2",
+    "https://bcr.bazel.build/modules/rules_proto/7.1.0/MODULE.bazel": "002d62d9108f75bb807cd56245d45648f38275cb3a99dcd45dfb864c5d74cb96",
+    "https://bcr.bazel.build/modules/rules_proto/7.1.0/source.json": "39f89066c12c24097854e8f57ab8558929f9c8d474d34b2c00ac04630ad8940e",
+    "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f",
+    "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300",
+    "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382",
+    "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed",
+    "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58",
+    "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937",
+    "https://bcr.bazel.build/modules/rules_python/0.36.0/MODULE.bazel": "a4ce1ccea92b9106c7d16ab9ee51c6183107e78ba4a37aa65055227b80cd480c",
+    "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c",
+    "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7",
+    "https://bcr.bazel.build/modules/rules_python/1.0.0/MODULE.bazel": "898a3d999c22caa585eb062b600f88654bf92efb204fa346fb55f6f8edffca43",
+    "https://bcr.bazel.build/modules/rules_python/1.0.0/source.json": "b0162a65c6312e45e7912e39abd1a7f8856c2c7e41ecc9b6dc688a6f6400a917",
+    "https://bcr.bazel.build/modules/rules_rust/0.45.1/MODULE.bazel": "a69d0db3a958fab2c6520961e1b2287afcc8b36690fd31bbc4f6f7391397150d",
+    "https://bcr.bazel.build/modules/rules_rust/0.51.0/MODULE.bazel": "2b6d1617ac8503bfdcc0e4520c20539d4bba3a691100bee01afe193ceb0310f9",
+    "https://bcr.bazel.build/modules/rules_rust/0.51.0/source.json": "79a530199d9826a93b31d05b7d9b39dc753a80f88856d3ca5376f665a82cc5e6",
+    "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c",
+    "https://bcr.bazel.build/modules/rules_shell/0.2.0/source.json": "7f27af3c28037d9701487c4744b5448d26537cc66cdef0d8df7ae85411f8de95",
+    "https://bcr.bazel.build/modules/rules_swift/1.16.0/MODULE.bazel": "4a09f199545a60d09895e8281362b1ff3bb08bbde69c6fc87aff5b92fcc916ca",
+    "https://bcr.bazel.build/modules/rules_swift/2.1.1/MODULE.bazel": "494900a80f944fc7aa61500c2073d9729dff0b764f0e89b824eb746959bc1046",
+    "https://bcr.bazel.build/modules/rules_swift/2.1.1/source.json": "40fc69dfaac64deddbb75bd99cdac55f4427d9ca0afbe408576a65428427a186",
+    "https://bcr.bazel.build/modules/snappy/1.2.0/MODULE.bazel": "cc7a727b46089c7fdae0ede21b1fd65bdb14d01823da118ef5c48044f40b6b27",
+    "https://bcr.bazel.build/modules/snappy/1.2.0/source.json": "17f5527e15d30a9d9eebf79ed73b280b56cac44f8c8fea696666d99943f84c33",
+    "https://bcr.bazel.build/modules/stardoc/0.5.0/MODULE.bazel": "f9f1f46ba8d9c3362648eea571c6f9100680efc44913618811b58cc9c02cd678",
+    "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8",
+    "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c",
+    "https://bcr.bazel.build/modules/stardoc/0.5.4/MODULE.bazel": "6569966df04610b8520957cb8e97cf2e9faac2c0309657c537ab51c16c18a2a4",
+    "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef",
+    "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c",
+    "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7",
+    "https://bcr.bazel.build/modules/stardoc/0.7.2/MODULE.bazel": "fc152419aa2ea0f51c29583fab1e8c99ddefd5b3778421845606ee628629e0e5",
+    "https://bcr.bazel.build/modules/stardoc/0.7.2/source.json": "58b029e5e901d6802967754adf0a9056747e8176f017cfe3607c0851f4d42216",
+    "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/MODULE.bazel": "5e463fbfba7b1701d957555ed45097d7f984211330106ccd1352c6e0af0dcf91",
+    "https://bcr.bazel.build/modules/swift_argument_parser/1.3.1.1/source.json": "32bd87e5f4d7acc57c5b2ff7c325ae3061d5e242c0c4c214ae87e0f1c13e54cb",
+    "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43",
+    "https://bcr.bazel.build/modules/upb/0.0.0-20230516-61a97ef/MODULE.bazel": "c0df5e35ad55e264160417fd0875932ee3c9dda63d9fccace35ac62f45e1b6f9",
+    "https://bcr.bazel.build/modules/xz/5.4.5.bcr.1/MODULE.bazel": "c037f75fa1b7e1ff15fbd15d807a8ce545e9b02f02df0a9777aa9aa7d8b268bb",
+    "https://bcr.bazel.build/modules/xz/5.4.5.bcr.1/source.json": "766f28499a16fa9ed8dc94382d50e80ceda0d0ab80b79b7b104a67074ab10e1f",
+    "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0",
+    "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27",
+    "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79",
+    "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca",
+    "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806",
+    "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198",
+    "https://bcr.bazel.build/modules/zstd/1.5.6/MODULE.bazel": "471ebe7d3cdd8c6469390fcf623eb4779ff55fbee0a87f1dc57a1def468b96d4",
+    "https://bcr.bazel.build/modules/zstd/1.5.6/source.json": "02010c3333fc89b44fe861db049968decb6e688411f7f9d4f6791d74f9adfb51"
+  },
+  "selectedYankedVersions": {},
+  "moduleExtensions": {}
+}
diff --git a/doc/xml_domain.md b/doc/xml_domain.md
new file mode 100644
index 0000000..0288284
--- /dev/null
+++ b/doc/xml_domain.md
@@ -0,0 +1,267 @@
+# XML Domain
+
+## Purpose
+
+The XML domain in FuzzTest is designed to generate well-formed XML (Extensible Markup Language) strings. These strings can be used as inputs for fuzz testing software that parses or processes XML data. By generating a wide variety of valid and complex XML structures, this domain helps uncover potential vulnerabilities, bugs, or unexpected behaviors in XML-handling code.
+
+## Design
+
+The XML domain is built using several components of the FuzzTest library, centered around the `XmlElement` class and the `XmlElementDomain` function.
+
+### `XmlElement` Structure
+
+The core of the XML generation is the `XmlElement` class, which represents a single XML element. It's defined to hold the tag name, attributes, and content of an element. The content itself can be either a simple text string or a vector of child `XmlElement` objects, allowing for recursive, nested structures.
+
+```cpp
+// Located in: fuzztest/internal/domains/xml_domain.h
+
+#include <string>
+#include <vector>
+#include <map>
+#include <variant> // Required for std::variant
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_join.h"
+
+namespace fuzztest::internal {
+
+// Forward declaration
+class XmlElement;
+
+// Define content type: can be a string (text) or a vector of child XmlElements
+using XmlContentType = std::variant<std::string, std::vector<XmlElement>>;
+
+// Represents an XML element.
+class XmlElement {
+ public:
+  std::string tag_name;
+  std::map<std::string, std::string> attributes;
+  XmlContentType content;
+
+  XmlElement() = default;
+  XmlElement(std::string tag, std::map<std::string, std::string> attrs, XmlContentType cont)
+      : tag_name(std::move(tag)), attributes(std::move(attrs)), content(std::move(cont)) {}
+
+  // Function to serialize the XmlElement to a string
+  std::string ToString() const {
+    std::string attrs_str;
+    for (const auto& attr : attributes) {
+      attrs_str += absl::StrCat(" ", attr.first, "=\"", attr.second, "\"");
+    }
+
+    std::string content_str;
+    if (std::holds_alternative<std::string>(content)) {
+      content_str = std::get<std::string>(content);
+    } else if (std::holds_alternative<std::vector<XmlElement>>(content)) {
+      for (const auto& child : std::get<std::vector<XmlElement>>(content)) {
+        content_str += child.ToString();
+      }
+    }
+    return absl::StrCat("<", tag_name, attrs_str, ">", content_str, "</", tag_name, ">");
+  }
+
+  template <typename Sink>
+  friend void AbslStringify(Sink& sink, const XmlElement& element) {
+    std::string attrs_str_repr;
+    for (const auto& attr : element.attributes) {
+      if (!attrs_str_repr.empty()) attrs_str_repr += ", ";
+      attrs_str_repr += absl::StrCat(attr.first, "=", attr.second);
+    }
+
+    std::string content_repr;
+    if (std::holds_alternative<std::string>(element.content)) {
+      content_repr = absl::StrCat("\"", std::get<std::string>(element.content), "\"");
+    } else if (std::holds_alternative<std::vector<XmlElement>>(element.content)) {
+      content_repr = absl::StrCat("[", absl::StrJoin(std::get<std::vector<XmlElement>>(element.content), ", ", [](std::string* out, const XmlElement& e){ out->append(e.ToString()); }), "]");
+    }
+
+    absl::Format(&sink, "XmlElement{tag_name=%s, attributes={%s}, content=%s}",
+                 element.tag_name, attrs_str_repr, content_repr);
+  }
+};
+
+}  // namespace fuzztest::internal
+```
+
+### Helper Domains
+
+Several helper domains are defined to generate the constituent parts of an XML element:
+
+-   `XmlTagName()`: Generates valid XML tag names (alphanumeric, starting with a letter).
+-   `XmlAttributeName()`: Generates valid XML attribute names (similar rules to tag names).
+-   `XmlAttributeValue()`: Generates string attribute values using printable ASCII characters (excluding quotes, which are handled by the serialization).
+-   `XmlAttributes()`: Creates a map of attribute name-value pairs.
+-   `XmlTextContent()`: Produces simple text strings that can serve as the content of an XML element.
+
+### `XmlElementDomain` Implementation
+
+The main domain, `XmlElementDomain()`, orchestrates the generation of `XmlElement` objects and their subsequent serialization into XML strings.
+
+-   **`fuzztest::DomainBuilder<XmlElement>`**: This is used to define the recursive structure of `XmlElement`. It allows an `XmlElement` to contain other `XmlElement` objects as children.
+-   **Content Generation**: The content of an element (`XmlContentType`) is generated using `fuzztest::OneOf`. This domain chooses between:
+    -   Simple text content, produced by `XmlTextContent().Map(...)`.
+    -   A vector of child `XmlElement` objects, produced by `builder.RecursiveContainerOf<std::vector<XmlElement>>(...).Map(...)`. The `RecursiveContainerOf` is crucial for creating nested XML structures, with `max_depth` and `max_elements` parameters to control complexity.
+-   **Object Construction**: `builder.Set(...)` is used to specify how to construct an `XmlElement` object, providing the domains for its `tag_name`, `attributes`, and `content` members.
+-   **Serialization to String**: Finally, `builder.Build().Map([](XmlElement&& element) { return element.ToString(); })` takes the generated `XmlElement` object and calls its `ToString()` method to produce the final XML string.
+
+```cpp
+// Located in: fuzztest/internal/domains/xml_domain.h
+
+// Domain for XML tag names (alphanumeric, starting with a letter)
+inline auto XmlTagName() {
+  return StringOf(AlphaNumericChar()).WithMinSize(1).Filter([](const std::string& s) {
+    return !s.empty() && std::isalpha(s[0]);
+  });
+}
+
+// Domain for XML attribute names (alphanumeric, starting with a letter)
+inline auto XmlAttributeName() {
+  return StringOf(AlphaNumericChar()).WithMinSize(1).Filter([](const std::string& s) {
+    return !s.empty() && std::isalpha(s[0]);
+  });
+}
+
+// Domain for XML attribute values (printable ASCII characters, excluding quotes)
+inline auto XmlAttributeValue() {
+  return StringOf(CharacterSet(" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'()*+,-./:;<=>?@[]^_`{|}~"));
+}
+
+// Domain for XML attributes (a map of name-value pairs)
+inline auto XmlAttributes() {
+  return Map(
+      [](auto&&... args) {
+        return std::map<std::string, std::string>(std::forward<decltype(args)>(args)...);
+      },
+      VectorOf(PairOf(XmlAttributeName(), XmlAttributeValue())).WithMaxSize(5));
+}
+
+// Domain for XML content (text)
+inline auto XmlTextContent() {
+    return StringOf(PrintableAsciiChar());
+}
+
+// Main XML Element Domain
+inline auto XmlElementDomain() {
+  DomainBuilder<XmlElement> builder;
+
+  // Define the domain for the content of an XML element.
+  // It can be either a simple text string or a vector of child XmlElement objects.
+  // MaxDepth is used for the recursive part to prevent infinite recursion.
+  // MaxElements for the container size.
+  auto xml_content_variant_domain = OneOf(
+      XmlTextContent().Map([](std::string s) { return XmlContentType(std::move(s)); }),
+      builder.RecursiveContainerOf<std::vector>(/*max_depth=*/3, /*max_elements=*/5)
+          .Map([](std::vector<XmlElement> v) { return XmlContentType(std::move(v)); })
+  );
+
+  builder.Set(
+      XmlTagName(),                // domain for tag_name
+      XmlAttributes(),             // domain for attributes
+      xml_content_variant_domain   // domain for content (XmlContentType)
+  );
+
+  return builder.Build().Map([](XmlElement&& element) {
+    // Use the ToString() method of XmlElement for serialization.
+    return element.ToString();
+  });
+}
+```
+
+## Usage
+
+To use the XML domain in your fuzz test:
+
+1.  **Include Header**: Add the necessary header file.
+    ```cpp
+    #include "fuzztest/internal/domains/xml_domain.h"
+    ```
+    *(Note: The exact path might vary based on your project's include structure.)*
+
+2.  **Use in `FUZZ_TEST`**: Specify `fuzztest::internal::XmlElementDomain()` in the `.WithDomains()` clause of your `FUZZ_TEST` macro.
+
+### Example Fuzz Test
+
+Here's an example demonstrating how to use the `XmlElementDomain` to test a hypothetical XML processing function:
+
+```cpp
+// Located in: examples/xml_fuzz_test.cc
+
+// NOTE: This example uses cc_test in its BUILD file instead of cc_fuzz_test
+// due to difficulties in locating the correct Bazel macro for cc_fuzz_test
+// in the testing environment. When integrating FuzzTest into your own project,
+// ensure your Bazel setup is correct to use cc_fuzz_test for full fuzzing
+// capabilities (corpus generation, coverage guidance, etc.).
+// The FUZZ_TEST macro itself is still used here and should work with a
+// FuzzTest-compatible main function (like fuzztest_gtest_main).
+
+#include "fuzztest/fuzztest.h"
+#include "fuzztest/internal/domains/xml_domain.h" // Adjust path as necessary
+#include <string>
+#include <iostream>
+#include <stack>
+#include <regex>
+
+// A simple placeholder function to "consume" XML strings.
+void ProcessXml(const std::string& xml_string) {
+  // std::cout << "Generated XML: " << xml_string << std::endl;
+  std::regex tag_regex("<([a-zA-Z0-9_:]+)([^>]*)>");
+  std::smatch match;
+  std::string::const_iterator search_start(xml_string.cbegin());
+  std::stack<std::string> open_tags;
+
+  while (std::regex_search(search_start, xml_string.cend(), match, tag_regex)) {
+    std::string tag_name = match[1].str();
+    std::string full_tag = match[0].str();
+
+    if (full_tag.size() > 1 && full_tag[full_tag.size() - 2] == '/') {
+      // Self-closing tag
+    } else if (full_tag.size() > 0 && full_tag[1] == '/') {
+      // Closing tag
+      std::string actual_tag_name = tag_name.substr(1);
+      if (open_tags.empty() || open_tags.top() != actual_tag_name) {
+        return;
+      }
+      if (!open_tags.empty()) {
+        open_tags.pop();
+      }
+    } else {
+      // Opening tag
+      open_tags.push(tag_name);
+    }
+    search_start = match.suffix().first;
+  }
+  // Optional: Assert that all tags were closed if strict well-formedness is always expected.
+  // FUZZTEST_ASSERT(open_tags.empty());
+}
+
+// Fuzz test for the ProcessXml function using the XML domain
+FUZZ_TEST(XmlFuzzTest, ProcessXmlConsumesValidXml)
+    .WithDomains(fuzztest::internal::XmlElementDomain());
+
+// Basic test with a fixed string
+TEST(XmlFuzzTest, ProcessXmlSimpleValidCase) {
+    ProcessXml("<root><item>Test</item></root>");
+}
+```
+
+### Note on Bazel Configuration for the Example
+
+The provided example (`examples/xml_fuzz_test.cc`) is configured in its `examples/BUILD` file to run using a standard `cc_test` Bazel rule, linking with `//fuzztest:fuzztest_gtest_main`. This was a workaround due to difficulties encountered in the development environment with loading the `cc_fuzz_test` Bazel macro.
+
+For full-fledged fuzzing (including corpus generation, advanced coverage guidance, etc.), you should use the `cc_fuzz_test` rule provided by FuzzTest. This typically involves loading it from a `.bzl` file (e.g., `load("@com_google_fuzztest//fuzztest:build_defs.bzl", "cc_fuzz_test")`) and using `cc_fuzz_test` instead of `cc_test` in your BUILD file. Ensure your project's Bazel WORKSPACE and FuzzTest integration are set up correctly to make `cc_fuzz_test` available.
+
+```bazel
+# Example BUILD file structure (conceptual) for cc_fuzz_test:
+# load("@com_google_fuzztest//fuzztest:build_defs.bzl", "cc_fuzz_test") # Or the correct path for your setup
+
+# cc_fuzz_test(
+#     name = "xml_fuzz_test",
+#     srcs = ["xml_fuzz_test.cc"],
+#     deps = [
+#         "//fuzztest:fuzztest",
+#         "//fuzztest/internal/domains:xml_domain_impl", # Or your path to xml_domain.h
+#         # Other necessary dependencies
+#     ],
+# )
+```
+
+By leveraging the XML domain, developers can create more robust and secure XML processing applications.
diff --git a/examples/BUILD b/examples/BUILD
new file mode 100644
index 0000000..ea03146
--- /dev/null
+++ b/examples/BUILD
@@ -0,0 +1,22 @@
+# Fuzz test example for the XML domain.
+
+# NOTE: This BUILD file uses cc_test instead of cc_fuzz_test due to difficulties
+# in locating the correct Bazel macro for cc_fuzz_test in this environment.
+# For full fuzzing capabilities, ensure your FuzzTest Bazel setup is correct
+# and cc_fuzz_test is properly loaded and used.
+# See comments in xml_fuzz_test.cc for more details.
+
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])
+
+cc_test(
+    name = "xml_fuzz_test",
+    srcs = ["xml_fuzz_test.cc"],
+    deps = [
+        "//fuzztest:fuzztest",  # Main FuzzTest library (provides FUZZ_TEST macro definitions)
+        "//fuzztest:fuzztest_gtest_main", # Provides a main function that runs Google Tests and Fuzz Tests
+        "//fuzztest/internal/domains:xml_domain_impl", # Our new XML domain library
+        "@com_google_googletest//:gtest", # GoogleTest library itself
+    ],
+)
diff --git a/examples/xml_fuzz_test.cc b/examples/xml_fuzz_test.cc
new file mode 100644
index 0000000..80280a3
--- /dev/null
+++ b/examples/xml_fuzz_test.cc
@@ -0,0 +1,115 @@
+// NOTE: This example uses cc_test in its BUILD file instead of cc_fuzz_test
+// due to difficulties in locating the correct Bazel macro for cc_fuzz_test
+// in the testing environment. When integrating FuzzTest into your own project,
+// ensure your Bazel setup is correct to use cc_fuzz_test for full fuzzing
+// capabilities (corpus generation, coverage guidance, etc.).
+// The FUZZ_TEST macro itself is still used here and should work with a
+// FuzzTest-compatible main function (like fuzztest_gtest_main).
+
+#include "fuzztest/fuzztest.h"
+#include "fuzztest/internal/domains/xml_domain.h" // Adjust path as necessary
+#include <string>
+#include <iostream>
+#include <stack>
+#include <regex>
+
+// A simple placeholder function to "consume" XML strings.
+// For a real test, this would be a proper XML parser or processing function.
+// This example will just print the generated XML and perform a trivial check.
+void ProcessXml(const std::string& xml_string) {
+  // std::cout << "Generated XML: " << xml_string << std::endl;
+
+  // Trivial check: Ensure all opening tags have corresponding closing tags.
+  // This is a very simplified check and not a full XML validation.
+  std::regex tag_regex("<([a-zA-Z0-9_:]+)([^>]*)>");
+  std::smatch match;
+  std::string::const_iterator search_start(xml_string.cbegin());
+  std::stack<std::string> open_tags;
+
+  while (std::regex_search(search_start, xml_string.cend(), match, tag_regex)) {
+    std::string tag_name = match[1].str();
+    std::string full_tag = match[0].str();
+
+    if (full_tag.size() > 1 && full_tag[full_tag.size() - 2] == '/') {
+      // Self-closing tag, ignore for stack balancing.
+    } else if (full_tag.size() > 0 && full_tag[1] == '/') {
+      // Closing tag
+      std::string actual_tag_name = tag_name.substr(1); // Remove '/'
+      if (open_tags.empty() || open_tags.top() != actual_tag_name) {
+        // Mismatched closing tag or closing tag without opening.
+        // For this simple test, we might not fail here,
+        // as the generator should ideally produce valid structures.
+        // However, real-world fuzzing would catch this with a proper parser.
+        // For now, we'll just note it.
+        // std::cerr << "Mismatched closing tag: " << actual_tag_name << std::endl;
+        // FUZZTEST_FAIL("Mismatched closing tag"); // Could enable this for stricter test
+        return; // Stop processing on error
+      }
+      if (!open_tags.empty()) {
+        open_tags.pop();
+      }
+    } else {
+      // Opening tag
+      open_tags.push(tag_name);
+    }
+    search_start = match.suffix().first;
+  }
+
+  // FUZZTEST_ASSERT(open_tags.empty()); // Assert all tags were closed
+  // If open_tags is not empty, it means some tags were not closed.
+  // Depending on how strict we want to be with the generator:
+  if (!open_tags.empty()) {
+      // std::cerr << "Not all tags were closed. Open tags: " << open_tags.size() << std::endl;
+      // FUZZTEST_FAIL("Not all tags were closed.");
+  }
+}
+
+// Fuzz test for the ProcessXml function using the XML domain
+FUZZ_TEST(XmlFuzzTest, ProcessXmlConsumesValidXml)
+    .WithDomains(fuzztest::internal::XmlElementDomain());
+
+// Basic test with a fixed string to ensure ProcessXml works as expected for a simple case.
+// This is more of a unit test for ProcessXml itself.
+TEST(XmlFuzzTest, ProcessXmlSimpleValidCase) {
+    ProcessXml("<root><item>Test</item></root>");
+}
+
+TEST(XmlFuzzTest, ProcessXmlSimpleSelfClosing) {
+    ProcessXml("<root><item name=\"test\"/></root>");
+}
+
+TEST(XmlFuzzTest, ProcessXmlSimpleMismatch) {
+    // This test is expected to "pass" as ProcessXml currently doesn't hard fail.
+    ProcessXml("<root><item>Test</mismatch></root>");
+}
+
+// To run this test, you would typically need to link against the FuzzTest library
+// and have a BUILD file entry. For example (using Bazel):
+//
+// cc_fuzz_test(
+//     name = "xml_fuzz_test",
+//     srcs = ["xml_fuzz_test.cc"],
+//     corpus = [], // Add seed corpus if any
+//     deps = [
+//         "//fuzztest",
+//         "//fuzztest/internal/domains:xml_domain_h_library", // Assuming xml_domain.h is part of a library
+//     ],
+// )
+
+// For CMake, you would add an executable and link fuzztest::fuzztest_main and other necessary targets.
+
+int main(int argc, char** argv) {
+  // Initialize FuzzTest
+  // This is usually handled by cc_fuzz_test in Bazel,
+  // but if running as a standalone gtest, you might need it.
+  // testing::InitGoogleTest(&argc, argv); // If mixing with GTest tests.
+  // return RUN_ALL_TESTS();
+  // For a pure FuzzTest setup, FuzzTest automatically registers and runs tests.
+  // If FUZZ_TEST is defined, it implies FuzzTest's main.
+  // If only TEST is defined, you need Google Test's main.
+  // The FuzzTest library provides a main function when `FUZZ_TEST` macros are used.
+  // So, a custom main is often not needed unless for specific GTest setups.
+  // For Bazel's cc_fuzz_test, no main() is needed here.
+  // For other build systems, you might need to link with FuzzTest's main library.
+  return 0; // Placeholder main, actual execution is handled by FuzzTest framework.
+}
diff --git a/fuzztest/internal/domains/BUILD b/fuzztest/internal/domains/BUILD
index 5a1d738..29d0ec5 100644
--- a/fuzztest/internal/domains/BUILD
+++ b/fuzztest/internal/domains/BUILD
@@ -214,3 +214,15 @@
     hdrs = ["utf.h"],
     deps = ["@abseil-cpp//absl/strings:string_view"],
 )
+
+cc_library(
+    name = "xml_domain_impl",
+    hdrs = ["xml_domain.h"],
+    deps = [
+        ":core_domains_impl",
+        "@abseil-cpp//absl/strings",
+        "@abseil-cpp//absl/types:variant", # For std::variant
+        "@com_google_fuzztest//fuzztest/internal:meta",
+        # Add other necessary Abseil or FuzzTest internal dependencies if xml_domain.h evolves
+    ],
+)
diff --git a/fuzztest/internal/domains/xml_domain.h b/fuzztest/internal/domains/xml_domain.h
new file mode 100644
index 0000000..4f96512
--- /dev/null
+++ b/fuzztest/internal/domains/xml_domain.h
@@ -0,0 +1,152 @@
+#ifndef FUZZTEST_INTERNAL_DOMAINS_XML_DOMAIN_H_
+#define FUZZTEST_INTERNAL_DOMAINS_XML_DOMAIN_H_
+
+#include <string>
+#include <vector>
+
+#include "fuzztest/internal/domains/domain_base.h"
+#include "fuzztest/internal/domains/string_domains.h" // For StringOf, CharacterSet
+#include "fuzztest/internal/domains/container_of_impl.h" // For VectorOf
+#include "fuzztest/internal/domains/map_impl.h" // For Map
+#include "fuzztest/internal/domains/one_of_impl.h" // For OneOf
+#include "fuzztest/internal/domains/domain_builder.h" // For DomainBuilder
+#include "fuzztest/internal/meta.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/str_join.h"
+
+
+namespace fuzztest::internal {
+
+// Forward declaration for recursive definition
+class XmlElement;
+
+// Domain for XML tag names (alphanumeric, starting with a letter)
+inline auto XmlTagName() {
+  return StringOf(AlphaNumericChar()).WithMinSize(1).Filter([](const std::string& s) {
+    return !s.empty() && std::isalpha(s[0]);
+  });
+}
+
+// Domain for XML attribute names (alphanumeric, starting with a letter)
+inline auto XmlAttributeName() {
+  return StringOf(AlphaNumericChar()).WithMinSize(1).Filter([](const std::string& s) {
+    return !s.empty() && std::isalpha(s[0]);
+  });
+}
+
+// Domain for XML attribute values (printable ASCII characters, excluding quotes)
+inline auto XmlAttributeValue() {
+  return StringOf(CharacterSet(" abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'()*+,-./:;<=>?@[]^_`{|}~"));
+}
+
+// Domain for XML attributes (a map of name-value pairs)
+inline auto XmlAttributes() {
+  return Map(
+      [](auto&&... args) {
+        return std::map<std::string, std::string>(std::forward<decltype(args)>(args)...);
+      },
+      VectorOf(PairOf(XmlAttributeName(), XmlAttributeValue())).WithMaxSize(5));
+}
+
+
+// Domain for XML content (text or nested elements)
+// This will be part of the recursive definition using DomainBuilder
+// For now, a simple text content domain.
+inline auto XmlTextContent() {
+    return StringOf(PrintableAsciiChar());
+}
+
+
+// Main XML Element Domain
+inline auto XmlElementDomain() {
+  DomainBuilder<XmlElement> builder;
+
+  // Define the domain for the content of an XML element.
+  // It can be either a simple text string or a vector of child XmlElement objects.
+  // MaxDepth is used for the recursive part to prevent infinite recursion.
+  // MaxElements for the container size.
+  auto xml_content_variant_domain = OneOf(
+      XmlTextContent().Map([](std::string s) { return XmlContentType(std::move(s)); }),
+      builder.RecursiveContainerOf<std::vector>(/*max_depth=*/3, /*max_elements=*/5)
+          .Map([](std::vector<XmlElement> v) { return XmlContentType(std::move(v)); })
+  );
+
+  builder.Set(
+      XmlTagName(),                // domain for tag_name
+      XmlAttributes(),             // domain for attributes
+      xml_content_variant_domain   // domain for content (XmlContentType)
+  );
+  // The DomainBuilder by default uses fuzztest::Arbitrary<XmlElement> which requires
+  // the type to be default constructible and aggregate initializable.
+  // Since we have a custom constructor and want to use specific domains for fields,
+  // we provide a factory function.
+  // builder.Set relies on the order of arguments matching the constructor of XmlElement,
+  // or matching the order of fields if it were an aggregate.
+
+  return builder.Build().Map([](XmlElement&& element) {
+    // Use the ToString() method of XmlElement for serialization.
+    return element.ToString();
+  });
+}
+
+#include <variant> // Required for std::variant
+
+// Forward declaration
+class XmlElement;
+
+// Define content type: can be a string (text) or a vector of child XmlElements
+using XmlContentType = std::variant<std::string, std::vector<XmlElement>>;
+
+// Represents an XML element.
+class XmlElement {
+ public:
+  std::string tag_name;
+  std::map<std::string, std::string> attributes;
+  XmlContentType content;
+
+  XmlElement() = default;
+  XmlElement(std::string tag, std::map<std::string, std::string> attrs, XmlContentType cont)
+      : tag_name(std::move(tag)), attributes(std::move(attrs)), content(std::move(cont)) {}
+
+  // Function to serialize the XmlElement to a string
+  std::string ToString() const {
+    std::string attrs_str;
+    for (const auto& attr : attributes) {
+      attrs_str += absl::StrCat(" ", attr.first, "=\"", attr.second, "\"");
+    }
+
+    std::string content_str;
+    if (std::holds_alternative<std::string>(content)) {
+      content_str = std::get<std::string>(content);
+    } else if (std::holds_alternative<std::vector<XmlElement>>(content)) {
+      for (const auto& child : std::get<std::vector<XmlElement>>(content)) {
+        content_str += child.ToString();
+      }
+    }
+    return absl::StrCat("<", tag_name, attrs_str, ">", content_str, "</", tag_name, ">");
+  }
+
+  template <typename Sink>
+  friend void AbslStringify(Sink& sink, const XmlElement& element) {
+    std::string attrs_str_repr;
+    for (const auto& attr : element.attributes) {
+      if (!attrs_str_repr.empty()) attrs_str_repr += ", ";
+      attrs_str_repr += absl::StrCat(attr.first, "=", attr.second);
+    }
+
+    std::string content_repr;
+    if (std::holds_alternative<std::string>(element.content)) {
+      content_repr = absl::StrCat("\"", std::get<std::string>(element.content), "\"");
+    } else if (std::holds_alternative<std::vector<XmlElement>>(element.content)) {
+      content_repr = absl::StrCat("[", absl::StrJoin(std::get<std::vector<XmlElement>>(element.content), ", ", [](std::string* out, const XmlElement& e){ out->append(e.ToString()); }), "]");
+    }
+
+    absl::Format(&sink, "XmlElement{tag_name=%s, attributes={%s}, content=%s}",
+                 element.tag_name, attrs_str_repr, content_repr);
+  }
+};
+
+
+}  // namespace fuzztest::internal
+
+#endif  // FUZZTEST_INTERNAL_DOMAINS_XML_DOMAIN_H_
diff --git a/xpath_validator/src/xpath_validator/domain/xml_domain.py b/xpath_validator/src/xpath_validator/domain/xml_domain.py
new file mode 100644
index 0000000..8621c7f
--- /dev/null
+++ b/xpath_validator/src/xpath_validator/domain/xml_domain.py
@@ -0,0 +1,45 @@
+import hypothesis.strategies as st
+
+# Helper function for generating valid XML tag names
+def tag_names():
+    return st.text(alphabet=st.characters(min_codepoint=ord('a'), max_codepoint=ord('z')), min_size=1)
+
+# Helper function for generating valid XML attribute names
+def attribute_names():
+    return st.text(alphabet=st.characters(min_codepoint=ord('a'), max_codepoint=ord('z')), min_size=1)
+
+# Helper function for generating valid XML attribute values
+def attribute_values():
+    return st.text(alphabet=st.characters(min_codepoint=ord('a'), max_codepoint=ord('z'), whitelist_categories=('N', 'L', 'P', 'Z', 'S')), min_size=1)
+
+# Helper function for generating XML attributes
+def attributes():
+    return st.dictionaries(attribute_names(), attribute_values())
+
+# Helper function for generating XML content (text)
+def content():
+    return st.text(alphabet=st.characters(min_codepoint=ord('a'), max_codepoint=ord('z'), whitelist_categories=('N', 'L', 'P', 'Z', 'S')))
+
+# Helper function to format attributes into a string
+def format_attributes(attrs):
+    if not attrs:
+        return ""
+    return " " + " ".join(f'{k}="{v}"' for k, v in attrs.items())
+
+# Define the XML domain using RecursiveDomain
+xml_domain = st.recursive(
+    st.builds(lambda tag, attrs_str, children_content: f"<{tag}{attrs_str}>{children_content}</{tag}>",
+              tag_names(),
+              attributes().map(format_attributes),
+              st.deferred(lambda: st.lists(xml_domain | content())).map("".join)),
+    lambda children: st.builds(lambda tag, attrs_str, children_content: f"<{tag}{attrs_str}>{children_content}</{tag}>",
+                               tag_names(),
+                               attributes().map(format_attributes),
+                               children.map("".join))
+)
+
+if __name__ == '__main__':
+    # Example usage:
+    # Generate a sample XML string
+    sample_xml = xml_domain.example()
+    print(sample_xml)