2025-03-19 11:03:37 +00:00
# Draw.io XML Schema Guide
2025-03-25 10:56:08 +00:00
This guide explains the structure of draw.io (diagrams.net) XML files to help you understand and create diagrams programmatically.
2025-03-19 11:03:37 +00:00
## Basic Structure
A draw.io XML file has the following hierarchy:
```xml
< mxfile >
< diagram >
< mxGraphModel >
< root >
< mxCell / > <!-- Cells that make up the diagram -->
< / root >
< / mxGraphModel >
< / diagram >
< / mxfile >
```
## Root Element: `<mxfile>`
The root element of a draw.io file.
2025-03-25 10:56:08 +00:00
**Attributes:**
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
- `host` : The application that created the file (e.g., "app.diagrams.net")
- `modified` : Last modification timestamp
- `agent` : Browser / user agent information
- `version` : Version of the application
- `type` : File type (usually "device" or "google")
**Example:**
```xml
2025-03-19 11:03:37 +00:00
< mxfile host = "app.diagrams.net" modified = "2023-07-14T10:20:30.123Z" agent = "Mozilla/5.0" version = "21.5.2" type = "device" >
```
## Diagram Element: `<diagram>`
Each page in your draw.io document is represented by a `<diagram>` element.
2025-03-25 10:56:08 +00:00
**Attributes:**
- `id` : Unique identifier for the diagram
- `name` : The name of the diagram / page
**Example:**
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
```xml
2025-03-19 11:03:37 +00:00
< diagram id = "pWHN0msd4Ud1ZK5cD-Hr" name = "Page-1" >
```
## Graph Model: `<mxGraphModel>`
Contains the actual diagram data.
2025-03-25 10:56:08 +00:00
**Attributes:**
- `dx` : Grid size in x-direction (usually 1)
- `dy` : Grid size in y-direction (usually 1)
- `grid` : Whether grid is enabled (0 or 1)
- `gridSize` : Grid cell size (usually 10)
- `guides` : Whether guides are enabled (0 or 1)
- `tooltips` : Whether tooltips are enabled (0 or 1)
- `connect` : Whether connections are enabled (0 or 1)
- `arrows` : Whether arrows are enabled (0 or 1)
- `fold` : Whether folding is enabled (0 or 1)
- `page` : Whether page view is enabled (0 or 1)
- `pageScale` : Scale of the page (usually 1)
- `pageWidth` : Width of the page (e.g., 850)
- `pageHeight` : Height of the page (e.g., 1100)
- `math` : Whether math typesetting is enabled (0 or 1)
- `shadow` : Whether shadows are enabled (0 or 1)
**Example:**
```xml
2025-03-19 11:03:37 +00:00
< mxGraphModel dx = "1" dy = "1" grid = "1" gridSize = "10" guides = "1" tooltips = "1" connect = "1" arrows = "1" fold = "1" page = "1" pageScale = "1" pageWidth = "850" pageHeight = "1100" math = "0" shadow = "0" >
```
## Root Cell Container: `<root>`
2025-12-14 14:04:44 +09:00
Contains all the cells in the diagram. **Note:** When generating diagrams, you only need to provide the mxCell elements - the root container and root cells (id="0", id="1") are added automatically.
2025-03-19 11:03:37 +00:00
2025-12-14 14:04:44 +09:00
**Internal structure (auto-generated):**
2025-03-25 10:56:08 +00:00
```xml
2025-03-19 11:03:37 +00:00
< root >
2025-12-14 14:04:44 +09:00
< mxCell id = "0" / > <!-- Auto - added -->
< mxCell id = "1" parent = "0" / > <!-- Auto - added -->
<!-- Your mxCell elements go here (start from id="2") -->
2025-03-19 11:03:37 +00:00
< / root >
```
## Cell Elements: `<mxCell>`
2025-03-25 10:56:08 +00:00
The basic building block of diagrams. Cells represent shapes, connectors, text, etc.
**Attributes for all cells:**
- `id` : Unique identifier for the cell
- `parent` : ID of the parent cell (typically "1" for most cells)
- `value` : Text content of the cell
- `style` : Styling information (see Style section below)
**Attributes for shapes (vertices):**
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
- `vertex` : Set to "1" for shapes
- `connectable` : Whether the shape can be connected (0 or 1)
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
**Attributes for connectors (edges):**
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
- `edge` : Set to "1" for connectors
- `source` : ID of the source cell
- `target` : ID of the target cell
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
**Example (Rectangle shape):**
```xml
2025-03-19 11:03:37 +00:00
< mxCell id = "2" value = "Hello World" style = "rounded=0;whiteSpace=wrap;html=1;" vertex = "1" parent = "1" >
< mxGeometry x = "350" y = "190" width = "120" height = "60" as = "geometry" / >
< / mxCell >
```
2025-03-25 10:56:08 +00:00
**Example (Connector):**
```xml
2025-03-19 11:03:37 +00:00
< mxCell id = "3" value = "" style = "endArrow=classic;html=1;rounded=0;" edge = "1" parent = "1" source = "2" target = "4" >
< mxGeometry width = "50" height = "50" relative = "1" as = "geometry" >
< mxPoint x = "400" y = "430" as = "sourcePoint" / >
< mxPoint x = "450" y = "380" as = "targetPoint" / >
< / mxGeometry >
< / mxCell >
```
## Geometry: `<mxGeometry>`
Defines the position and dimensions of cells.
2025-03-25 10:56:08 +00:00
**Attributes for shapes:**
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
- `x` : The x-coordinate of the **top-left** point of the shape.
- `y` : The y-coordinate of the **top-left** point of the shape.
- `width` : The width of the shape.
- `height` : The height of the shape.
- `as` : Specifies the role of this geometry within its parent cell. Typically set to `"geometry"` for the main shape definition.
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
**Attributes for connectors:**
- `relative` : Set to "1" for relative geometry
- `as` : Set to "geometry"
**Example for shapes:**
```xml
2025-03-19 11:03:37 +00:00
< mxGeometry x = "350" y = "190" width = "120" height = "60" as = "geometry" / >
```
2025-03-25 10:56:08 +00:00
**Example for connectors:**
```xml
2025-03-19 11:03:37 +00:00
< mxGeometry width = "50" height = "50" relative = "1" as = "geometry" >
< mxPoint x = "400" y = "430" as = "sourcePoint" / >
< mxPoint x = "450" y = "380" as = "targetPoint" / >
< / mxGeometry >
```
## Cell Style Reference
2025-03-25 10:56:08 +00:00
Styles are specified as semicolon-separated `key=value` pairs in the `style` attribute of `<mxCell>` elements.
### Shape-specific Styles
- Rectangle: `shape=rectangle`
- Ellipse: `shape=ellipse`
- Triangle: `shape=triangle`
- Rhombus: `shape=rhombus`
- Hexagon: `shape=hexagon`
- Cloud: `shape=cloud`
- Actor: `shape=actor`
- Cylinder: `shape=cylinder`
- Document: `shape=document`
- Note: `shape=note`
- Card: `shape=card`
- Parallelogram: `shape=parallelogram`
2025-03-19 11:03:37 +00:00
### Connector Styles
2025-03-25 10:56:08 +00:00
- `endArrow=classic` : Arrow type at the end (classic, open, oval, diamond, block)
- `startArrow=none` : Arrow type at the start (none, classic, open, oval, diamond)
- `curved=1` : Curved connector (0 or 1)
- `edgeStyle=orthogonalEdgeStyle` : Connector routing style
- `elbow=vertical` : Elbow direction (vertical, horizontal)
- `jumpStyle=arc` : Jump style for line crossing (arc, gap)
- `jumpSize=10` : Size of the jump
2025-03-19 11:03:37 +00:00
## Special Cells
Draw.io files contain two special cells that are always present:
2025-03-25 10:56:08 +00:00
1. **Root Cell** (id = "0"): The parent of all cells
2. **Default Parent Cell** (id = "1", parent = "0"): The default layer and parent for most cells
2025-03-19 11:03:37 +00:00
2025-12-14 14:04:44 +09:00
## Tips for Creating Draw.io XML
2025-03-19 11:03:37 +00:00
2025-12-14 14:04:44 +09:00
1. **Generate ONLY mxCell elements** - wrapper tags and root cells (id="0", id="1") are added automatically
2. Start IDs from "2" (id="0" and id="1" are reserved for root cells)
2025-03-25 10:56:08 +00:00
3. Assign unique and sequential IDs to all cells
2025-12-14 14:04:44 +09:00
4. Define parent relationships correctly (use parent="1" for top-level shapes)
2025-03-25 10:56:08 +00:00
5. Use `mxGeometry` elements to position shapes
6. For connectors, specify `source` and `target` attributes
2025-12-14 14:04:44 +09:00
7. **CRITICAL: All mxCell elements must be siblings. NEVER nest mxCell inside another mxCell.**
2025-03-19 11:03:37 +00:00
## Common Patterns
### Grouping Elements
2025-03-25 10:56:08 +00:00
To group elements, create a parent cell and set other cells' `parent` attribute to its ID:
2025-03-19 11:03:37 +00:00
2025-03-25 10:56:08 +00:00
```xml
2025-03-19 11:03:37 +00:00
<!-- Group container -->
< mxCell id = "10" value = "Group" style = "group" vertex = "1" connectable = "0" parent = "1" >
< mxGeometry x = "200" y = "200" width = "200" height = "100" as = "geometry" / >
< / mxCell >
<!-- Elements inside the group -->
< mxCell id = "11" value = "Element 1" style = "rounded=0;whiteSpace=wrap;html=1;" vertex = "1" parent = "10" >
< mxGeometry width = "90" height = "40" as = "geometry" / >
< / mxCell >
< mxCell id = "12" value = "Element 2" style = "rounded=0;whiteSpace=wrap;html=1;" vertex = "1" parent = "10" >
< mxGeometry x = "110" width = "90" height = "40" as = "geometry" / >
< / mxCell >
```
### Swimlanes
2025-12-03 16:14:53 +09:00
Swimlanes use the `swimlane` shape style. **IMPORTANT: All mxCell elements (swimlanes, steps, and edges) must be siblings under `<root>`. Edges are NOT nested inside swimlanes or steps.**
2025-03-19 11:03:37 +00:00
```xml
2025-12-03 16:14:53 +09:00
< root >
< mxCell id = "0" / >
< mxCell id = "1" parent = "0" / >
<!-- Swimlane 1 -->
< mxCell id = "lane1" value = "Frontend" style = "swimlane;startSize=30;" vertex = "1" parent = "1" >
< mxGeometry x = "40" y = "40" width = "200" height = "300" as = "geometry" / >
< / mxCell >
<!-- Swimlane 2 -->
< mxCell id = "lane2" value = "Backend" style = "swimlane;startSize=30;" vertex = "1" parent = "1" >
< mxGeometry x = "280" y = "40" width = "200" height = "300" as = "geometry" / >
< / mxCell >
<!-- Step inside lane1 (parent="lane1") -->
< mxCell id = "step1" value = "Send Request" style = "rounded=1;" vertex = "1" parent = "lane1" >
< mxGeometry x = "20" y = "60" width = "160" height = "40" as = "geometry" / >
< / mxCell >
<!-- Step inside lane2 (parent="lane2") -->
< mxCell id = "step2" value = "Process" style = "rounded=1;" vertex = "1" parent = "lane2" >
< mxGeometry x = "20" y = "60" width = "160" height = "40" as = "geometry" / >
< / mxCell >
<!-- Edge connecting step1 to step2 (sibling element, NOT nested inside steps) -->
< mxCell id = "edge1" style = "edgeStyle=orthogonalEdgeStyle;endArrow=classic;" edge = "1" parent = "1" source = "step1" target = "step2" >
< mxGeometry relative = "1" as = "geometry" / >
< / mxCell >
< / root >
2025-03-19 11:03:37 +00:00
```
### Tables
2025-03-25 10:56:08 +00:00
Tables use multiple cells with parent-child relationships:
2025-03-19 11:03:37 +00:00
```xml
< mxCell id = "30" value = "Table" style = "shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex = "1" parent = "1" >
< mxGeometry x = "200" y = "200" width = "180" height = "120" as = "geometry" / >
< / mxCell >
2025-03-25 10:56:08 +00:00
< mxCell id = "31" value = "" style = "shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[0,0.5,1,0.5];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex = "1" parent = "30" >
2025-03-19 11:03:37 +00:00
< mxGeometry y = "30" width = "180" height = "30" as = "geometry" / >
< / mxCell >
```
## Advanced Features
### Custom Attributes
Draw.io allows adding custom attributes to cells:
```xml
< mxCell id = "40" value = "Custom Element" style = "rounded=0;whiteSpace=wrap;html=1;" vertex = "1" parent = "1" >
< mxGeometry x = "200" y = "200" width = "120" height = "60" as = "geometry" / >
< Object label = "Custom Label" customAttr = "value" / >
< / mxCell >
```
These custom attributes can store additional metadata or be used by plugins and custom behaviors.
2025-03-25 10:56:08 +00:00
### User-defined Styles
2025-03-19 11:03:37 +00:00
You can define custom styles for cells by combining various style attributes:
```xml
2025-03-25 10:56:08 +00:00
< mxCell id = "50" value = "Custom Styled Cell"
style="shape=hexagon;perimeter=hexagonPerimeter2;whiteSpace=wrap;html=1;fixedSize=1;fillColor=#f8cecc ;strokeColor=#b85450 ;strokeWidth=2;fontSize=14;fontStyle=1"
2025-03-19 11:03:37 +00:00
vertex="1" parent="1">
< mxGeometry x = "300" y = "200" width = "120" height = "80" as = "geometry" / >
< / mxCell >
```
### Layers
You can create multiple layers in a diagram to organize complex diagrams:
```xml
<!-- Default layer (always present) -->
< mxCell id = "1" parent = "0" / >
<!-- Additional custom layer -->
< mxCell id = "60" value = "Layer 2" style = "locked=0;group=" parent = "0" / >
<!-- Elements in Layer 2 -->
< mxCell id = "61" value = "Element in Layer 2" style = "rounded=0;whiteSpace=wrap;html=1;" vertex = "1" parent = "60" >
< mxGeometry x = "200" y = "300" width = "120" height = "60" as = "geometry" / >
< / mxCell >
```