diff --git a/.chronus/changes/complex-array-tests-2026-2-12-18-44-14.md b/.chronus/changes/complex-array-tests-2026-2-12-18-44-14.md
new file mode 100644
index 00000000000..35d65b72758
--- /dev/null
+++ b/.chronus/changes/complex-array-tests-2026-2-12-18-44-14.md
@@ -0,0 +1,7 @@
+---
+changeKind: feature
+packages:
+ - "@typespec/http-specs"
+---
+
+Add tests for complex xml array definitions
diff --git a/packages/http-specs/spec-summary.md b/packages/http-specs/spec-summary.md
index c68a503c558..a583dcaab9b 100644
--- a/packages/http-specs/spec-summary.md
+++ b/packages/http-specs/spec-summary.md
@@ -2995,6 +2995,60 @@ Expected response body:
```
+### Payload_Xml_ComplexArrayNoItemsValue_get
+
+- Endpoint: `get /payload/xml/complexArrayModelNoItems`
+
+Expected response body:
+
+```xml
+
+```
+
+### Payload_Xml_ComplexArrayNoItemsValue_put
+
+- Endpoint: `put /payload/xml/complexArrayModelNoItems`
+
+Expected request body:
+
+```xml
+
+```
+
+### Payload_Xml_ComplexArrayValue_get
+
+- Endpoint: `get /payload/xml/complexArrayModel`
+
+Expected response body:
+
+```xml
+
+
+ 123abc
+
+
+ 123abc
+
+
+```
+
+### Payload_Xml_ComplexArrayValue_put
+
+- Endpoint: `put /payload/xml/complexArrayModel`
+
+Expected request body:
+
+```xml
+
+
+ 123abc
+
+
+ 123abc
+
+
+```
+
### Payload_Xml_ModelWithArrayOfModelValue_get
- Endpoint: `get /payload/xml/modelWithArrayOfModel`
diff --git a/packages/http-specs/specs/payload/xml/main.tsp b/packages/http-specs/specs/payload/xml/main.tsp
index d768dfb2d2d..d6fda1bccd0 100644
--- a/packages/http-specs/specs/payload/xml/main.tsp
+++ b/packages/http-specs/specs/payload/xml/main.tsp
@@ -126,6 +126,22 @@ model XmlErrorBody {
code: int32;
}
+@doc("The complex model.")
+@name("ComplexModel")
+model ComplexModel {
+ @doc("The unique ID for the complex model.")
+ @name("Id")
+ id: string;
+}
+
+@doc("Contains an array of complex models with XML unwrapped representation.")
+model UnwrappedArrayModel {
+ @doc("The array of complex models.")
+ @unwrapped
+ @name("MyModel")
+ items: Array;
+}
+
@doc("Template for XML operations")
interface XmlOperations {
@scenario
@@ -389,3 +405,30 @@ interface XmlErrorValue {
@body body: SimpleModel;
} | XmlError;
}
+
+@doc("Operations for the UnwrappedArrayModel type.")
+@route("/unwrappedArrayModel")
+interface UnwrappedArrayValue
+ extends XmlOperations<
+ UnwrappedArrayModel,
+ """
+
+
+ 123abc
+
+
+ 123abc
+
+
+ """
+ > {}
+
+@doc("Operations for the UnwrappedArrayModel type with no items (empty array).")
+@route("/unwrappedArrayModelNoItems")
+interface UnwrappedArrayNoItemsValue
+ extends XmlOperations<
+ UnwrappedArrayModel,
+ """
+
+ """
+ > {}
diff --git a/packages/http-specs/specs/payload/xml/mockapi.ts b/packages/http-specs/specs/payload/xml/mockapi.ts
index de2d3f85834..0c29d3fa7be 100644
--- a/packages/http-specs/specs/payload/xml/mockapi.ts
+++ b/packages/http-specs/specs/payload/xml/mockapi.ts
@@ -136,6 +136,19 @@ export const modelWithDatetime = `
`;
+export const unwrappedArrayModel = `
+
+
+ 123abc
+
+
+ 123abc
+
+
+`;
+
+export const unwrappedArrayOfModelNoItems = ``;
+
// Some clients serialize UTC datetimes without trailing zero milliseconds. Both
// "2022-08-26T18:38:00.000Z" and "2022-08-26T18:38:00Z" are valid RFC3339 representations
// of the same instant; accept either form.
@@ -317,3 +330,17 @@ Scenarios.Payload_Xml_XmlErrorValue_get = passOnCode(400, {
},
kind: "MockApiDefinition",
});
+
+const Payload_Xml_UnwrappedArrayModel = createServerTests(
+ "/payload/xml/unwrappedArrayModel",
+ unwrappedArrayModel,
+);
+Scenarios.Payload_Xml_UnwrappedArrayValue_get = Payload_Xml_UnwrappedArrayModel.get;
+Scenarios.Payload_Xml_UnwrappedArrayValue_put = Payload_Xml_UnwrappedArrayModel.put;
+
+const Payload_Xml_UnwrappedArrayOfModelNoItems = createServerTests(
+ "/payload/xml/unwrappedArrayOfModelNoItems",
+ unwrappedArrayOfModelNoItems,
+);
+Scenarios.Payload_Xml_UnwrappedArrayNoItemsValue_get = Payload_Xml_UnwrappedArrayOfModelNoItems.get;
+Scenarios.Payload_Xml_UnwrappedArrayNoItemsValue_put = Payload_Xml_UnwrappedArrayOfModelNoItems.put;