# ZAPD XML specification

ZAPD XMLs use a restrictive subset of the XML standard: any ZAPD XML must be a valid XML (All elements starting with `<tag>` ending appropriately with `</tag>`, single "empty-element" tags with `/` at the end, etc.).

Reminder that in

```xml
<a>
    <b1>
        <c/>
    </b1>
    <b2>
        <d/>
    </b2>
    <e/>
</a>
```

`<b1>`, `<b2>`, `<e/>` are *children* of `<a>`, but `<c/>` is not. `<c/>` is a *descendent* of `<a>` and a child of `<b>`.

- Every XML's outermost element start/end tag is a single `<Root>`.
- The children of a `<Root>` must be `<File>`s.
- A `<File>` has *resources* as children. A resource is almost always single empty-element tag, and has one of the types
  - `<Texture>`
  - `<Background>`
  - `<Blob>`
  - `<DList>`
  - `<TextureAnimation>`
  - `<Scene>`
  - `<Room>`
  - `<AltHeader>`
  - `<Animation>`
  - `<PlayerAnimation>`
  - `<CurveAnimation>`
  - `<LegacyAnimation>`
  - `<Skeleton>`
  - `<LimbTable>`
  - `<Limb>`
  - `<Symbol>`
  - `<Collision>`
  - `<Scalar>`
  - `<Vector>`
  - `<Vtx>`
  - `<Mtx>`
  - `<Cutscene>`
  - `<Array>`
  - `<Path>`
  - `<PlayerAnimationData>`

- A `<File>` cannot descend from a `<File>`.
- All resources must be children of a `<File>`.
- `<Array>` is the only paired resource tag enclosing an element; the element must be a single resource tag, one of
  - `<Scalar>`
  - `<Vector>`
  - `<Vtx>`