---
title: Guide
---
# Xml Library
## Default encoding of scalars
As in Json we have some [default handling](https://typespec.io/docs/libraries/http/encoding#bytes) of the common scalars like `utcDateTime`
| Scalar Type | Default Encoding | Encoding name |
| ---------------- | ----------------- | --------------------------------------- |
| `utcDateTime` | `xs:dateTime` | `TypeSpec.Xml.Encoding.xmlDateTime` |
| `offsetDateTime` | `xs:dateTime` | `TypeSpec.Xml.Encoding.xmlDateTime` |
| `plainDate` | `xs:date` | `TypeSpec.Xml.Encoding.xmlDate` |
| `plainTime` | `xs:time` | `TypeSpec.Xml.Encoding.xmlTime` |
| `duration` | `xs:duration` | `TypeSpec.Xml.Encoding.xmlDuration` |
| `bytes` | `xs:base64Binary` | `TypeSpec.Xml.Encoding.xmlBase64Binary` |
## Examples
### 1. Array of primitive types
<table>
<tr>
<td>TypeSpec</td>
<td>Xml</td>
<td>OpenAPI3</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 1.1 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
@encodedName("application/xml", "XmlPet")
model Pet {
@xml.unwrapped
tags: string[];
}
```
</td>
<td>
```xml
<XmlPet>
<tags>abc</tags>
<tags>def</tags>
</XmlPet>
```
</td>
<td>
```yaml
Pet:
type: "object"
properties:
tags:
type: "array"
items:
type: string
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- -------------------------------------------------- SCENARIO 1.2 ------------------------------------------------------------ -->
<tr>
<td>
```tsp
@encodedName("application/xml", "XmlPet")
model Pet {
@encodedName("application/xml", "ItemsTags")
tags: string[];
}
```
</td>
<td>
```xml
<XmlPet>
<ItemsTags>
<string>abc</string>
<string>def</string>
</ItemsTags>
</XmlPet>
```
</td>
<td>
```yaml
Pet:
type: "object"
properties:
tags:
type: "array"
xml:
name: "ItemsTags"
wrapped: true
items:
type: string
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- ---------------------------------------------------- SCENARIO 1.3 ---------------------------------------------------------- -->
<tr>
<td>
```tsp
@encodedName("application/xml", "ItemsName")
scalar tag extends string;
@encodedName("application/xml", "XmlPet")
model Pet {
@xml.unwrapped
tags: tag[];
}
```
</td>
<td>
```xml
<XmlPet>
<ItemsName>abc</ItemsName>
<ItemsName>def</ItemsName>
</XmlPet>
```
</td>
<td>
```yaml
Pet:
type: "object"
properties:
tags:
type: "array"
xml:
name: "ItemsTags"
items:
type: string
xml:
name: ItemsName
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- ---------------------------------------------------- SCENARIO 1.4 ---------------------------------------------------------- -->
<tr>
<td>
```tsp
@encodedName("application/xml", "ItemsName")
scalar tag extends string;
@encodedName("application/xml", "XmlPet")
model Pet {
@encodedName("application/xml", "ItemsTags")
tags: tag[];
}
```
</td>
<td>
```xml
<XmlPet>
<ItemsTags>
<ItemsName>abc</ItemsName>
<ItemsName>def</ItemsName>
</ItemsTags>
</XmlPet>
```
</td>
<td>
```yaml
Pet:
type: "object"
properties:
tags:
type: "array"
xml:
name: "ItemsTags"
wrapped: true
items:
type: string
xml:
name: ItemsName
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- -------------------------------------------------------------------------------------------------------------- -->
</table>
### 2. Complex array types
<table>
<tr>
<td>TypeSpec</td>
<td>Xml</td>
<td>OpenAPI3</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 2.1 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
@encodedName("application/xml", "XmlPet")
model Pet {
@xml.unwrapped
tags: Tag[];
}
@encodedName("application/xml", "XmlTag")
model Tag {
name: string;
}
```
</td>
<td>
```xml
<XmlPet>
<XmlTag>
<name>string</name>
</XmlTag>
</XmlPet>
```
</td>
<td>
```yaml
Tag:
type: "object"
properties:
name:
type: "string"
xml:
name: "XmlTag"
Pet:
type: "object"
properties:
tags:
type: "array"
items:
$ref: "#/definitions/Tag"
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- -------------------------------------------------- SCENARIO 2.2 ------------------------------------------------------------ -->
<tr>
<td>
```tsp
@encodedName("application/xml", "XmlPet")
model Pet {
tags: Tag[];
}
@encodedName("application/xml", "XmlTag")
model Tag {
name: string;
}
```
</td>
<td>
```xml
<XmlPet>
<ItemsTags>
<XmlTag>
<name>string</name>
</XmlTag>
</ItemsTags>
</XmlPet>
```
</td>
<td>
```yaml
Tag:
type: "object"
properties:
name:
type: "string"
xml:
name: "XmlTag"
Pet:
type: "object"
properties:
tags:
type: "array"
xml:
name: "ItemsTags"
wrapped: true
items:
$ref: "#/definitions/Tag"
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- ---------------------------------------------------- SCENARIO 2.3 ---------------------------------------------------------- -->
<tr>
<td>
```tsp
@encodedName("application/xml", "XmlPet")
model Pet {
@encodedName("application/xml", "ItemsTags")
@xml.unwrapped
tags: Tag[];
}
@encodedName("application/xml", "XmlTag")
model Tag {
name: string;
}
```
</td>
<td>
```xml
<XmlPet>
<ItemsTag>
<name>string</name>
</ItemsTag>
</XmlPet>
```
</td>
<td>
```yaml
Tag:
type: "object"
properties:
name:
type: "string"
xml:
name: "XmlTag"
Pet:
type: "object"
properties:
tags:
type: "array"
xml:
name: "ItemsTags"
items:
$ref: "#/definitions/Tag"
xml:
name: ItemsXMLName
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- ---------------------------------------------------- SCENARIO 2.4 ---------------------------------------------------------- -->
<tr>
<td>
```tsp
@encodedName("application/xml", "XmlPet")
model Pet {
@encodedName("application/xml", "ItemsTags")
tags: Tag[];
}
@encodedName("application/xml", "XmlTag")
model Tag {
name: string;
}
```
</td>
<td>
```xml
<XmlPet>
<ItemsTags>
<XmlTag>
<name>string</name>
</XmlTag>
</ItemsTags>
</XmlPet>
```
</td>
<td>
```yaml
Tag:
type: "object"
properties:
name:
type: "string"
Pet:
type: "object"
properties:
tags:
type: "array"
xml:
name: "ItemsTags"
wrapped: true
items:
$ref: "#/definitions/Tag"
xml:
name: "XmlPet"
```
</td>
</tr>
<!-- -------------------------------------------------------------------------------------------------------------- -->
</table>
### 3. Nested models
<table>
<tr>
<td>TypeSpec</td>
<td>Xml</td>
<td>OpenAPI3</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 3.1 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
model Book {
author: Author;
}
model Author {
name: string;
}
```
</td>
<td>
```xml
<Book>
<author>
<name>string</name>
</author>
</Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
author:
$ref: "#/components/schemas/Author"
Author:
type: object
properties:
name:
type: string
```
</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 3.2 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
model Book {
author: Author;
}
@encodedName("application/xml", "XmlAuthor")
model Author {
name: string;
}
```
</td>
<td>
```xml
<Book>
<author>
<name>string</name>
</author>
</Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
author:
allOf:
- $ref: "#/components/schemas/Author"
xml:
name: "author" # Here we have to redefine this name otherwise in OpenAPI semantic the `XmlAuthor` name would be used
Author:
type: object
properties:
name:
type: string
xml:
name: "XmlAuthor"
```
</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 3.3 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
model Book {
@encodedName("application/xml", "xml-author")
author: Author;
}
model Author {
name: string;
}
```
</td>
<td>
```xml
<Book>
<xml-author>
<name>string</name>
</xml-author>
</Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
author:
allOf:
- $ref: "#/components/schemas/Author"
xml:
name: "xml-author"
Author:
type: object
properties:
name:
type: string
```
</td>
</tr>
<!-- -------------------------------------------------------------------------------------------------------------- -->
</table>
### 4. Attributes
<table>
<tr>
<td>TypeSpec</td>
<td>Xml</td>
<td>OpenAPI3</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 4.1 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
model Book {
@Xml.attribute
id: string;
title: string;
author: string;
}
```
</td>
<td>
```xml
<Book id="0">
<xml-title>string</xml-title>
<author>string</author>
</Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
id:
type: integer
title:
type: string
xml:
name: "xml-title"
author:
type: string
```
</td>
</tr>
<!-- -------------------------------------------------------------------------------------------------------------- -->
</table>
### 5. Namespace and prefix (inline form)
<table>
<tr>
<td>TypeSpec</td>
<td>Xml</td>
<td>OpenAPI3</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 5.1 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
@Xml.ns("smp", "http://example.com/schema")
model Book {
id: string;
title: string;
author: string;
}
```
</td>
<td>
```xml
<smp:Book xmlns:smp="http://example.com/schema">
<id>0</id>
<title>string</title>
<author>string</author>
</smp:Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
id:
type: integer
title:
type: string
author:
type: string
xml:
prefix: "smp"
namespace: "http://example.com/schema"
```
</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 5.2 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
@Xml.ns("smp", "http://example.com/schema")
model Book {
id: string;
@Xml.ns("smp", "http://example.com/schema")
title: string;
@Xml.ns("ns2", "http://example.com/ns2")
author: string;
}
```
</td>
<td>
```xml
<smp:Book xmlns:smp="http://example.com/schema" xmlns:sn2="http://example.com/ns2">
<id>0</id>
<smp:title>string</smp:title>
<ns2:author>string</ns2:author>
</smp:Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
id:
type: integer
title:
type: string
xml:
prefix: "smp"
namespace: "http://example.com/schema"
author:
type: string
xml:
prefix: "ns2"
namespace: "http://example.com/ns2"
xml:
prefix: "smp"
namespace: "http://example.com/schema"
```
</td>
</tr>
<!-- -------------------------------------------------------------------------------------------------------------- -->
</table>
### 6. Namespace and prefix (normalized form)
<table>
<tr>
<td>TypeSpec</td>
<td>Xml</td>
<td>OpenAPI3</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 6.1 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
@Xml.nsDeclarations
enum Namespaces {
smp: "http://example.com/schema",
}
@Xml.ns(Namespaces.smp)
model Book {
id: string;
title: string;
author: string;
}
```
</td>
<td>
```xml
<smp:Book xmlns:smp="http://example.com/schema">
<id>0</id>
<title>string</title>
<author>string</author>
</smp:Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
id:
type: integer
title:
type: string
author:
type: string
xml:
prefix: "smp"
namespace: "http://example.com/schema"
```
</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 6.2 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
@Xml.nsDeclarations
enum Namespaces {
smp: "http://example.com/schema",
ns2: "http://example.com/ns2",
}
@Xml.ns(Namespaces.smp)
model Book {
id: string;
@Xml.ns(Namespaces.smp)
title: string;
@Xml.ns(Namespaces.ns2)
author: string;
}
```
</td>
<td>
```xml
<smp:Book xmlns:smp="http://example.com/schema" xmlns:sn2="http://example.com/ns2">
<id>0</id>
<smp:title>string</smp:title>
<ns2:author>string</ns2:author>
</smp:Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
id:
type: integer
title:
type: string
xml:
prefix: "smp"
namespace: "http://example.com/schema"
author:
type: string
xml:
prefix: "ns2"
namespace: "http://example.com/ns2"
xml:
prefix: "smp"
namespace: "http://example.com/schema"
```
</td>
</tr>
<!-- -------------------------------------------------------------------------------------------------------------- -->
</table>
### 6. Property setting the text of the node
<table>
<tr>
<td>TypeSpec</td>
<td>Xml</td>
<td>OpenAPI3</td>
</tr>
<!-- --------------------------------------------------- SCENARIO 6.1 ----------------------------------------------------------- -->
<tr>
<td>
```tsp
model BlobName {
@Xml.attribute language: string;
@Xml.unwrapped content: string;
}
```
</td>
<td>
```xml
<BlobName language="abc">
...content...
</smp:Book>
```
</td>
<td>
```yaml
Book:
type: object
properties:
language:
type: string
content:
type: string
xml:
x-ms-text: true # on autorest emitter
```
</td>
</tr>
<!-- -------------------------------------------------------------------------------------------------------------- -->
</table>microsoft/typespec
Publicmirrored from https://github.com/microsoft/typespecAvailable
docs/libraries/xml/guide.md
948lines · modepreview