DMSContent XML Format
The DMSContent format is the primary output format of the enaio® server for search results and object retrievals. It is returned by the research and retrieval jobs of the DMS engine.
The corresponding schema file is DMSContent.xsd.
The format can be in LOL (linear hit list), HOL (hierarchical object list)
or MIXED (combination of both) — controlled by the format attribute on the root element.
1. Usage
The DMSContent format is returned by the following jobs:
| Job | Format | Description |
|---|---|---|
LOL / HOL / MIXED |
Primary research job — returns hit lists from search queries |
|
HOL |
Returns complete index data for one or more objects |
|
LOL / HOL |
Executes a stored search query |
|
HOL |
Returns typeless objects from the user tray (contains |
|
HOL |
Returns objects from the workflow tray |
|
HOL |
Returns deleted objects |
|
HOL |
Returns linked objects from other archives |
|
HOL |
Returns index data in HOL format |
2. Output Formats (LOL vs. HOL)
The format attribute on the <DMSContent> element determines the internal structure of the results:
| Value | Format | Structure within <ObjectType> |
|---|---|---|
|
List of Lists |
|
|
Hierarchical Object List |
|
|
Combination |
Contains both |
2.1. LOL — Linear Hit List
The LOL structure is the compact tabular format: columns are defined once, then the hit rows follow. Suitable for large result sets and simple fields.
<DMSContent format="LOL" version="5.00" timestamp="2024-03-15T10:30:00"
user="admin" station="PC01">
<Archive id="1" internal_name="patient">
<ObjectType id="5" internal_name="medical_letter" type="DOCUMENT" modul="WINDOWS">
<Rowset>
<Columns>
<Column internal_name="date" dbname="D001" type="DATE" ostype="DATE">Date</Column>
<Column internal_name="subject" dbname="D002" type="TEXT" ostype="TEXT">Subject</Column>
<Column internal_name="physician" dbname="D003" type="TEXT" ostype="TEXT">Physician</Column>
</Columns>
<Rows>
<Row id="9823">
<Value>2024-03-15</Value>
<Value>Discharge letter</Value>
<Value>Dr. Müller</Value>
</Row>
<Row id="9824">
<Value>2024-03-10</Value>
<Value>Hospital documentation</Value>
<Value>Dr. Schmidt</Value>
</Row>
</Rows>
</Rowset>
<Statistics pagesize="20" startpos="0" total_hits="42"/>
</ObjectType>
</Archive>
<Messages/>
</DMSContent>
2.2. HOL — Hierarchical Object List
The HOL structure returns complete object data per instance. Each <Object> contains
fields, base parameters, rights information as well as optional child objects and variants.
<DMSContent format="HOL" version="5.00" timestamp="2024-03-15T10:30:00"
user="admin" station="PC01">
<Archive id="1" internal_name="patient">
<ObjectType id="5" internal_name="medical_letter" type="DOCUMENT" modul="WINDOWS">
<ObjectList>
<Object id="9823" export_depth="0">
<Fields>
<Field internal_name="date" dbname="D001" type="DATE">2024-03-15</Field>
<Field internal_name="subject" dbname="D002" type="TEXT">Discharge letter</Field>
</Fields>
<BaseParams>
<Creator>admin</Creator>
<Created value="1710500000">2024-03-15</Created>
<CreationDate>2024-03-15</CreationDate>
<Modifier>admin</Modifier>
<Modified value="1710500000">2024-03-15</Modified>
<Owner osguid="550e8400-e29b-41d4-a716-446655440000">admin</Owner>
<Links>0</Links>
<TxtNoticeCount>0</TxtNoticeCount>
<PdfAnnotationCount>0</PdfAnnotationCount>
<SystemID>0</SystemID>
<ForeignID></ForeignID>
<ArchiveState value="1">ARCHIVED</ArchiveState>
<Archivist>admin</Archivist>
<ArchiveDate>2024-03-15</ArchiveDate>
<Locked value="0">UNLOCKED</Locked>
<Version>1</Version>
<DocumentPageCount>3</DocumentPageCount>
</BaseParams>
<FileProperties extension="docx" mimetype="application/vnd.openxmlformats-officedocument.wordprocessingml.document" mimetypegroup="application" count="1" size="24576" documentpagecount="3"/>
</Object>
</ObjectList>
<Statistics pagesize="20" startpos="0" total_hits="1"/>
</ObjectType>
</Archive>
<Messages/>
</DMSContent>
3. Elements and Attributes
3.1. <DMSContent> (root element)
| Attribute | Type | Default | Description |
|---|---|---|---|
|
Required |
Output format: |
|
|
xs:long |
|
Internal system ID of the server |
|
xs:long |
|
Language ID (7 = German) |
|
xs:string |
— |
Logged-in user |
|
xs:string |
— |
Computer/station name of the user |
|
xs:dateTime |
— |
Time of response (ISO 8601) |
|
xs:string |
|
enaio® server version |
|
xs:string |
— |
Server instance |
|
xs:string |
|
Output language (0 = server default) |
Child elements:
-
<Archive>(0..*) — Archive container with hits -
<TypelessObjects>(0..1) — Typeless objects (only for certain jobs) -
<Messages>(1) — Error messages (empty if successful)
3.2. <Archive>
Groups hits by archive. Is output once for each archive that contains hits.
| Attribute | Type | Default | Description |
|---|---|---|---|
|
xs:long |
|
Numeric archive ID |
|
xs:string |
— |
Display name of the archive |
|
xs:string |
— |
Internal name of the archive |
|
xs:string |
— |
GUID of the archive |
3.3. <ObjectType>
Describes the object type of the contained hits.
| Attribute | Type | Default | Description |
|---|---|---|---|
|
— |
Type of the object: |
|
|
xs:long |
|
Numeric ID of the object type |
|
xs:short |
|
Main type of the object type. Value range and meaning: Object Type ID. |
|
xs:short |
|
Subtype of the object type (lowword of the object type ID). |
|
xs:string |
— |
Database table of the object type |
|
xs:string |
— |
Display name of the object type |
|
xs:string |
— |
Internal name of the object type |
|
xs:string |
— |
GUID of the object type |
|
|
Document module (only relevant for documents) |
|
|
xs:short |
|
|
|
xs:string |
— |
Alias name of the object type |
|
xs:short |
|
|
Child elements:
-
Either
<Rowset>(LOL) or<ObjectList>(HOL) -
Optional
<SQL>— the executed SQL statement -
<Statistics>— hit statistics (always present)
3.3.1. <SQL>
The SQL statement generated and executed by the server, as the text content of a <Select>
element. Delivered when the query sets sql="1" on the
<DMSQuery> element. The block sits per <ObjectType>
between the result (<Rowset> or <ObjectList>) and <Statistics>.
<SQL><Select>SELECT DISTINCT d.id , d.feld1, d.feld2, … FROM object2 d, sdrel x
WHERE x.object_id=d.id AND (x.deleted=0 OR x.deleted is NULL)
AND (d.deleted is NULL or d.deleted=0)
AND (d.feld2 LIKE 'SQL\_2497273a' AND (d.zahl3 = 2 OR d.zahl3 = 3))</Select></SQL>
The join over the relation table sdrel and the DISTINCT are the reason an object filed in
several places appears only once in the result. The clause
(d.deleted is NULL or d.deleted=0) shows that the server treats both forms of
OBJECT_DELETED as "not deleted".
How conditions are translated into SQL — the wildcards in particular — is described at wildcards in text conditions.
3.4. <Rowset> (LOL)
Contains the tabular search result. Columns are defined once in <Columns>,
the data values follow in <Rows>.
3.4.1. <Columns> / <Column>
<Columns> contains <Column> elements for each returned column and optionally
<TableField> elements for table fields.
<Column> carries the field name as text content and the complete field definition as attributes (field_ident).
The <Column> elements inside a <TableField> carry the same attribute group. At this
position the schema as shipped by the manufacturer describes them as text only — the server delivers
the complete field definition there as well. For the HOL format, the same schema already describes
this correctly in RowsetType (see Deviations Between Schema and Server Behaviour).
|
3.4.2. <Rows> / <Row> / <Value>
Each <Row> corresponds to a hit object.
Attribute on <Row> |
Type | Required | Description |
|---|---|---|---|
|
xs:long |
— |
Object ID of the hit |
The <Value> elements within a <Row> correspond positionally to the columns from <Columns>.
Attribute on <Value> |
Type | Default | Description |
|---|---|---|---|
Text content |
xs:string |
— |
Display value of the field content (formatted/translated) |
|
xs:string |
— |
Internal raw value (e.g. key of a catalog field) |
For catalog fields, the text content contains the display name (e.g. male), the value attribute contains the internal key (e.g. M). For programmatic processing, value should be used.
|
Table fields appear as <TableField> child elements in the <Row> (parallel to the <Value> elements).
3.4.3. Measured example
Excerpt of a LOL response from enaio® server 12.0.769.25242 for a document type with a table
field, trimmed to three result columns and one hit. Note: the <TableField> appears in
<Columns> and in every <Row>, <Value> carries the raw value in the value attribute for
translated values, an empty value appears as an empty element, and <Rights> sits at the end of
the <Row>, once per hit.
<Rowset>
<Columns>
<Column object="Dokument" type="DOCUMENT" name="docpagecount"
internal_name="OBJECT_DOCPAGECOUNT" system="1" datatype="INTEGER"
dbname="docpagecount" ostype="9" osguid="1905" size="10">OBJECT_DOCPAGECOUNT</Column>
<Column object="Dokument" type="DOCUMENT" name="lockuser"
internal_name="OBJECT_LOCKUSER" system="1" datatype="INTEGER"
dbname="lockuser" ostype="9" osguid="1116" size="10">OBJECT_LOCKUSER</Column>
<Column object="Dokument" type="DOCUMENT" name="version"
internal_name="OBJECT_VERID" system="1" datatype="INTEGER"
dbname="version" ostype="9" osguid="1115" size="10">OBJECT_VERID</Column>
<!-- … further result columns … -->
<TableField object="Dokument" type="DOCUMENT" name="Table Field"
internal_name="TableField" datatype="LIST" dbname="list1" ostype="W"
osguid="9ABBD7483C06436E90BA7756F57A88C3" size="0">
<Columns>
<Column name="Table Col 1" internal_name="TableCol1" datatype="TEXT"
dbname="feld1" ostype="X" osguid="FEDC8C33CB5B4970A47CE399D2964124"
size="50">Table Col 1</Column>
<Column name="Table Col 2" internal_name="TableCol2" datatype="INTEGER"
dbname="zahl1" ostype="9" osguid="A29522A908EB4AD091D41C2248E4D8F5"
size="8">Table Col 2</Column>
</Columns>
</TableField>
</Columns>
<Rows>
<Row id="146373">
<Value>2</Value>
<Value value="0">UNLOCKED</Value>
<Value/>
<TableField name="Table Field" internal_name="TableField" datatype="LIST"
dbname="list1" ostype="W" osguid="9ABBD7483C06436E90BA7756F57A88C3" size="0">
<Row id="1">
<Value>Zeile pdf</Value>
<Value>1</Value>
</Row>
</TableField>
<Rights object_inserts="0" modify_index="1" delete_object="1"
export_object="1" modify_object="1"/>
</Row>
</Rows>
</Rowset>
The column text is the internal name of the field (OBJECT_VERID), not the display name; that
one sits in the name attribute. For the columns of a table field it is the other way round —
there the text is the display name (Table Col 1).
3.5. <ObjectList> (HOL)
Contains a list of <Object> elements with complete object data.
3.5.1. <Object>
| Attribute | Type | Required | Description |
|---|---|---|---|
|
xs:long |
Yes |
Object ID |
|
xs:long |
— |
Export depth (for nested queries) |
Child elements of <Object> (all optional):
| Element | Content |
|---|---|
|
Simple index fields as |
|
Multi-fields (MultiFields) |
|
Table fields (TableFields) |
|
Access rights of the logged-in user for this object (Rights) |
|
Base parameters (creator, modification date, archiving status etc.) (BaseParams) |
|
Notes on the object (Remarks) |
|
Document variants (only for documents with variants) (DocumentVariants) |
|
File information (FileProperties) |
|
Child objects (for folders/registers with substructure) — contains further |
|
Linked objects from other archives (ExternalObjects) |
3.5.2. <Fields> / <Field>
<Fields> contains <Field> elements, one per index field.
| Attribute | Type | Default | Description |
|---|---|---|---|
Text content |
xs:string |
— |
Display value of the field (formatted) |
|
xs:string |
— |
Internal raw value (for catalog fields: key) |
|
xs:string |
— |
Display name of the field (field label from the object type) |
|
xs:string |
— |
Display name of the field |
|
xs:string |
— |
Internal (technical) name of the field |
|
xs:string |
— |
Database column name |
|
xs:string |
— |
GUID of the field |
|
xs:string |
— |
Associated object type (for cross-field queries) |
|
xs:short |
|
|
|
xs:string |
— |
Field type (internal, e.g. |
|
xs:string |
— |
Database data type |
|
xs:string |
— |
enaio® field data type — see |
|
xs:long |
— |
Field length in characters |
|
xs:short |
|
|
|
xs:long |
|
Sorting position of the field in the mask |
ostype codes
The code appears on <Field>, <Column> and <TableField> and denotes the field data type of
the object definition. Measured against enaio® server 12.0.769.25242 across three cabinets and
nine object types, read from the <Columns> blocks of LOL responses — these describe the result
columns and arrive regardless of whether the query has any hits.
ostype |
datatype |
Example fields |
|---|---|---|
|
DECIMAL |
DoubleField, float |
|
SMALLINT |
CheckboxField |
|
SMALLINT |
GroupField, RadioField1 |
|
DATETIME |
DateTime, DateTimeField |
|
INTEGER |
ID, OSID, Ziffern |
|
TIME |
Time, TimeField |
|
TEXT |
Characters |
|
DATE |
Date, DateField |
|
TEXT |
UpperCharacters |
|
TEXT |
asf |
|
TEXT |
Yes_No |
|
TEXT |
FieldRightGroupControls |
|
TEXT |
mwd |
|
TEXT |
lr |
|
LIST |
TableField (table field) |
|
TEXT |
AllCharacters, AutoProposals, CatalogAddon |
|
TEXT |
ZiffernAlpha |
The mapping is not unique. 9 stands for DATETIME, INTEGER and TIME; several letters
stand for TEXT. The datatype alone therefore does not determine the field data type, nor the
other way round. An unambiguous evaluation has to use both attributes.
|
| The table lists what exists on the measured system. Whether further codes occur is open — that would require an object type containing every field type the object definition allows. |
3.5.3. <MultiFields> / <MultiField> / <Page> / <Value>
Multi-fields index every stored page of a document individually. They are possible on document types only and are assigned to a form area of their own in the object definition; the database field type is "all characters".
|
What counts is not A caller who assumes the page count of the PDF is therefore mistaken. |
Multi-fields are delivered for HOL queries only. In a LOL response they are absent
entirely — even when the field is requested by name in the
<Fields>; it appears there neither as a <MultiFields>
block nor as a column.
|
<MultiFields>
<MultiField internal_name="keywords" dbname="D010">
<Page id="1">
<Value>Invoice</Value>
<Value>2024</Value>
</Page>
</MultiField>
</MultiFields>
|
Several things need to be considered when using multi-fields:
The manufacturer therefore recommends using multi-fields sparingly; for most use cases a table field achieves the same. |
Attribute on <MultiField> |
Type | Description |
|---|---|---|
|
xs:string |
Display name of the multi-field |
|
xs:string |
Internal name |
|
xs:string |
Database column name |
|
xs:string |
GUID of the field |
|
xs:string |
Database data type — measured |
|
xs:string |
enaio® field data type — measured |
|
xs:long |
Field length in characters |
The schema as shipped by the manufacturer declares only dbname, name and
internal_name on <MultiField>. The server sends the same complete attribute group there as on
<Field> — the same finding as for the columns of a LOL table field.
|
A document with three attached files (FileProperties/@count 3), created via
dms.XMLInsert and read with field_schema="ALL":
<MultiFields>
<MultiField name="Multifield" internal_name="Moltifield" datatype="TEXT" dbname="feld3"
ostype="X" osguid="199A8E947A154189ABD5315C3CEEF468" size="255">
<Page id="1">
<Value>Rechnung</Value>
<Value>2026</Value>
</Page>
<Page id="2">
<Value>Anlage</Value>
</Page>
<Page id="3">
<Value>Unterschrift</Value>
</Page>
</MultiField>
</MultiFields>
A <Page> can therefore carry several <Value> elements; the documented TEXT/ASCII import
format with exactly one index value per page does not cover the full range of the XML interface.
A multi-field is written via dms.XMLInsert and
dms.XMLUpdate. On update a write replaces the value of the given
page; the option REPLACEMULTIFIELDS controls
replacing versus appending, not the permitted page range — that range applies to the update
unchanged.
If the multi-field is additionally listed as a <Field> in the
<Fields> of the query while field_schema="ALL" applies,
the server returns the whole <MultiField> block twice — identical in content. Without naming
it explicitly it arrives once. A consumer should therefore deduplicate <MultiField> by
internal_name.
|
| The statements on the form area, the locking behaviour and the import format come from the manufacturer documentation for enaio® 10.x and 11.x and are not measured. Measured are the structure and attributes of the response and the behaviour on duplicate naming. |
3.5.4. <TableFields> / <TableField>
Table fields in HOL format follow the RowsetType: <Columns>/<Column>+ defines the columns,
<Row id>/<Value>* contains the rows.
<TableFields>
<TableField internal_name="positions" dbname="D020">
<Columns>
<Column internal_name="pos_nr" dbname="D021">Pos.</Column>
<Column internal_name="description" dbname="D022">Description</Column>
<Column internal_name="amount" dbname="D023">Amount</Column>
</Columns>
<Row id="1">
<Value>1</Value>
<Value>Consultation</Value>
<Value>1200.00</Value>
</Row>
<Row id="2">
<Value>2</Value>
<Value>Travel expenses</Value>
<Value>350.00</Value>
</Row>
</TableField>
</TableFields>
3.5.5. <Rights>
Access rights of the currently logged-in user for the object.
| Attribute | Type | Default | Description |
|---|---|---|---|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
<Rights> can contain <ObjectInserts> child elements that indicate how many objects of a specific type may still be inserted underneath:
Attribute on <ObjectInserts> |
Type | Required | Description |
|---|---|---|---|
|
xs:long |
Yes |
|
|
xs:long |
Yes |
Remaining allowed instances ( |
Measured against enaio® server 12.0.769.25242, on a folder with object_inserts="1": one
<ObjectInserts> arrives per permitted child type, including with count="0" when nothing is
currently filed there.
<Rights object_inserts="1" modify_index="1" delete_object="1"
export_object="1" modify_object="1">
<ObjectInserts type="262145" count="0"/>
<ObjectInserts type="6488066" count="9"/>
<ObjectInserts type="6488067" count="0"/>
</Rights>
<ObjectInserts> only appears when the query sets object_inserts="1". On documents
<Rights> stays empty, because no objects can be filed below a document.
|
3.5.6. <BaseParams>
Base parameters are system metadata that exist for every object.
| Element | Description |
|---|---|
|
Creator user name |
|
Creation time as formatted string; attribute |
|
Creation date without time |
|
Last modifier user name |
|
Modification time; attribute |
|
Owner (user name as text, GUID as attribute) |
|
Number of links to this object |
|
Number of text notices on the object |
|
Number of PDF annotations on the object |
|
System ID (for reference documents) |
|
Foreign ID (for reference documents from external systems) |
|
Archiving status as text (ArchiveStateType) + numeric value as attribute |
|
User name of the archiver. Filled on non-archived documents as well — with the creating user in that case (see ArchiveStateType) |
|
Date of archiving. Filled on non-archived documents as well — with the creation date in that case |
|
Checkout status as text (LockedType) + numeric value as attribute |
|
Version number of the object |
|
End of the retention period |
|
Planned end of the retention period |
|
Page count of the document |
The document-specific part — from <ArchiveState> to <DocumentPageCount> — is only
delivered for documents. For folders and registers, the <BaseParams> end after <ForeignID>.
The elements <TxtNoticeCount>, <PdfAnnotationCount>, <RetentionDate>,
<RetentionPlannedDate> and <DocumentPageCount> are missing from the schema as shipped by the
manufacturer but are sent by the server.
|
3.5.7. <ExternalObjects>
Result of a cross-archive query
(<ExternalObjects> in the DMSQuery). Sits inside the
<Object> element of the main object, that is per hit of the main query, and carries the same
structure as an ordinary response below it:
<ExternalObjects> → <Archive> → <ObjectType> → <ObjectList> → <Object> plus a
<Statistics> of its own per external <ObjectType>.
The nested <Archive> carries the same identification attributes as the top-level <Archive>
(name, id, osguid).
<Object id="145980">
<Fields>
<Field internal_name="Name">XEDoc_8fc57e77</Field>
<Field internal_name="StringField">XLINK_8fc57e77</Field>
</Fields>
<ExternalObjects>
<Archive name="Unittest" id="0" osguid="C5B13DB661AC456A81CF70072ADEF5B0">
<ObjectType name="Unittest" id="0" internal_name="Unittest" type="FOLDER" table="stamm1">
<ObjectList>
<Object id="145981">
<Fields>
<Field internal_name="StringField">XLINK_8fc57e77</Field>
</Fields>
</Object>
</ObjectList>
<Statistics startpos="0" pagesize="-1" total_hits="1"/>
</ObjectType>
</Archive>
</ExternalObjects>
</Object>
If the condition of the external archive cannot be resolved — for instance because a
<LinkedValue ref="…"/> points at an alias that was never assigned — the <ObjectList> stays
empty and total_hits reads 0. The server gives no indication of this; <Messages> stays
empty.
|
3.5.8. <Remarks>
Notes on the object. Sent exactly when the query sets the attribute remarks="1" on the
<DMSQuery> element, and then present on every object —
on folders and registers as well, and also when no note is stored. Without the attribute the
element is absent entirely.
Position: directly after <BaseParams>, before <DocumentVariants> or <ChildObjects>.
Every note appears as a <Remark> element inside it. There are two forms, distinguished by
relation:
-
Object note (
relation="0") — a coloured text note on the object.typecarries the colour,<Text>the note text. -
Note link (
relation="1") — a link to another object.typeis0,idis0,mediumis0, and<Creator>,<Created>,<Modifier>,<Modified>and<Text>stay empty. The link appears on both objects involved, distinguished byrelationdirection.
Attribute on <Remark> |
Type | Description |
|---|---|---|
|
xs:long |
Note ID. |
|
xs:short |
Colour of the object note: |
|
xs:short |
|
|
xs:short |
Only for |
|
xs:long |
Only for |
|
xs:long |
Only for |
|
xs:long |
Medium ID of the note file; |
medium is not suited to telling an object note and a note link apart; relation is.
The value is the medium ID of the note file and not a constant: under
file-system storage the ID of the NOTE system medium
(5 on the server measured), under database storage 0, because there is no note file. The column
remarks.medium holds NULL in the database case, not 0. Measured against enaio® server
12.0.
|
Child elements, always all five and in this order:
| Element | Content |
|---|---|
|
Creator name, user ID in the |
|
Creation date as formatted text, Unix timestamp in the |
|
Last editor, user ID in the |
|
Date of the last change, Unix timestamp in the |
|
Note text. Filled for the object note, empty for the note link. Under database storage the |
<Remarks>
<Remark id="146579" type="2" relation="0" medium="5">
<Creator id="2">ROOT</Creator>
<Created value="1790332281">25.09.2026 12:31:21</Created>
<Modifier id="2">ROOT</Modifier>
<Modified value="1790332281">25.09.2026 12:31:21</Modified>
<Text id="">First object note</Text>
</Remark>
<Remark id="0" type="0" relation="1" relationdirection="0"
relatedobjectid="146380" relatedobjecttype="262145" medium="0">
<Creator id="0"/>
<Created value="0"/>
<Modifier id="0"/>
<Modified value="0"/>
<Text id=""/>
</Remark>
</Remarks>
The example comes from a server with file-system note storage: medium carries the medium ID and
<Text id> is empty. Under database storage the object note has medium="0" and <Text id>
carries the textid.
<TxtNoticeCount> in the <BaseParams> counts object notes
only. Note links do not enter the counter — an object with a TxtNoticeCount of 0 may well
carry <Remark> elements.
|
Notes are created via dms.XMLInsert and
dms.XMLUpdate with <RemarkText> or <RemarkObject>
(DMSData).
3.5.9. <DocumentVariants> / <DocumentVariant>
Variants are recursively structured: each variant can itself contain sub-variants.
| Attribute | Type | Required | Description |
|---|---|---|---|
|
xs:long |
Yes |
Object ID of this variant |
|
xs:long |
Yes |
Object ID of the parent variant ( |
|
xs:string |
Yes |
Version label. The root variant carries |
|
xs:short |
Yes |
|
3.5.10. <FileProperties>
Properties of the file stored with the document. Empty element, all information is in attributes.
| Attribute | Type | Description |
|---|---|---|
|
xs:string |
File extension without dot (e.g. |
|
xs:string |
MIME type of the file |
|
xs:string |
Group of the file type as an upper-case token (enaio®-specific, not the MIME main type) — see measured values |
|
xs:long |
Number of files of the document |
|
xs:long |
File size in bytes |
|
xs:long |
ID of the file icon |
|
xs:long |
Page count of the document. Appears only when the page count is greater than |
The attributes mimetypegroup, iconid and documentpagecount are missing from the schema
as shipped by the manufacturer but are sent by the server. documentpagecount appears only on
documents with a page count greater than 0 — measured on a two-page PDF; for JPG, DOCX, XLSX and
TXT the attribute is absent entirely. In parallel the page count is always present as
<DocumentPageCount> in the <BaseParams>, there with 0 as well.
|
The page count is determined afterwards by a server-side step. Immediately after the
import even a multi-page document reports <DocumentPageCount>0</DocumentPageCount> and omits
documentpagecount; measured, the correct value was present after about two minutes. A page count
of 0 right after the import therefore says nothing about the file (see
Timing after the import).
|
Measured values of mimetypegroup
The group is a short token per application family, not the prefix of the MIME type. Measured against enaio® server 12.0.769.25242 with one document per format:
| Extension | mimetype |
mimetypegroup |
iconid |
|---|---|---|---|
|
|
|
1073743982 |
|
|
|
1073743984 |
|
|
|
1073743959 |
|
|
|
1073744006 |
|
|
|
1073743978 |
| Five measurement points say nothing about whether the set of tokens is closed. Further formats (msg, tif, zip, pptx) have not been measured. |
3.6. <TypelessObjects> / <TypelessObject>
Typeless objects are documents without assigned object type — for example, documents in the user tray
or the workflow tray. They are listed directly under <DMSContent> separately from <Archive>.
| Attribute | Type | Required | Description |
|---|---|---|---|
|
xs:long |
Yes |
Object ID |
|
xs:short |
Yes |
Document main type. Values and meaning: Object Type ID. |
|
Yes |
Document module |
|
|
xs:string |
Yes |
Owner user name |
|
xs:long |
— |
Number of pages |
|
xs:long |
— |
File size in bytes |
|
xs:long |
— |
MIME type ID |
|
xs:string |
Yes |
Timestamp of the object as a Unix timestamp |
The schema as shipped by the manufacturer lists all eight attributes as required. Measured
against enaio® server 12.0.769.25242, the server sends only id, maintype, module, user
and timestamp — pagecount, filesize and mimetypeid are absent even when the object carries
a file. The schema version maintained for this documentation therefore lists the three as
optional.
|
3.7. <Messages> / <Message>
Server error messages. The element sits at the end of every response, directly below
<DMSContent>.
|
In every constellation measured so far Measured against enaio® server 12.0.769.25242 across 30 captured responses covering HOL, LOL,
user tray, The cases split cleanly into two groups: either the job aborts with an error code, or it runs
through and stays silent. A middle ground that fills |
| Attribute | Type | Required | Description |
|---|---|---|---|
Text content |
xs:string |
— |
Description of the error |
|
xs:long |
Yes |
Internal error code |
|
xs:long |
Yes |
Source code (identifies the server component) |
3.8. <Statistics>
Pagination information — always present, even if no hits are available.
| Attribute | Type | Required | Description |
|---|---|---|---|
|
xs:long |
Yes |
Maximum number of hits per page (configured in the request) |
|
xs:long |
Yes |
Start position (0-based) of the first returned hit |
|
xs:long |
Yes |
Total number of hits (across all pages) |
For paginated browsing: Total pages = ⌈total_hits / pagesize⌉. The next page is requested by startpos += pagesize.
|
4. Enumeration Types
4.1. dataformat
| Value | Meaning |
|---|---|
|
List of Lists — tabular format with |
|
Hierarchical Object List — object format with |
|
Combination of LOL and HOL |
4.3. modultype
| Value | Main type | Description |
|---|---|---|
|
|
Grayscale document |
|
|
Black/White document |
|
|
Color document |
|
|
Windows document (Office, PDF, …) |
|
|
Multimedia document |
|
|
Email document |
|
|
XML document |
|
|
Container document |
|
— |
Multi-page composite document |
|
— |
Reference document (reference to external system) |
|
— |
Unknown document type |
4.4. ArchiveStateType
Text content of <ArchiveState>; the value attribute carries the
corresponding bit value, the same one as the system field
OBJECT_FLAGS.
| Value | value |
Meaning |
|---|---|---|
|
|
Document can be archived (released) |
|
|
Document cannot be archived |
|
|
Document has no pages |
|
|
Document is archived |
|
— |
Error with one or more pages |
|
— |
Reference document — no own archive |
|
— |
Status unknown |
The four bit values were measured against enaio® server 12.0.769.25242. No measurement is
available for PAGE_ERROR, REFERENCE and UNKNOWN.
|
A document counts as archived only when <ArchiveState> carries the value
ARCHIVED. <Archivist> and <ArchiveDate> are filled on
non-archived documents as well — measured for NOT_ARCHIVABLE and NO_PAGES with the creating
user and the creation date. Testing for "is archived" through those two elements is therefore
wrong.
|
The transition to ARCHIVED does not come from the import but from a separate archiving run.
Measured on five documents of two pages each:
| Time after the import | Page count | <ArchiveState> |
|---|---|---|
immediately |
|
|
after 2 minutes |
|
|
after 5 and after 10 minutes |
|
|
The page count is filled by a server-side step within the first minutes, the archiving run follows separately from it. Anyone reading immediately after the import gets an intermediate state for both.
4.5. LockedType
Text content of <Locked> and of the system field
OBJECT_LOCKUSER.
| Value | Meaning |
|---|---|
|
Document is not checked out |
|
Document is checked out by the user of the querying session |
|
Document is checked out by another user |
|
Document is externally locked |
The value attribute is not a state code but the ID of the locking user
(benutzer.id). 0 means not locked, 1 an
external lock, and any other value is a user ID from
mng.GetUserList. The text state therefore cannot be derived from
value.
|
SELF and OTHERS are moreover not stored but evaluated against the user of the querying
session: the same document reports SELF for the locking user and OTHERS for everyone else,
while value carries the same user ID in both cases. An evaluation that targets the locking user
has to use value, not the text.
Four documents in one response, queried from the session of ROOT (user ID 2):
| Text content | value |
How produced |
|---|---|---|
|
|
unchanged, and after dms.UndoCheckOutDocument |
|
|
dms.CheckOutDocument with |
|
|
|
|
|
checkout by a second user with the ID |
The 2 for SELF is therefore not a state code but the ID of ROOT.
The same four documents, the same query, once as ROOT (ID 2) and once as a second user
(ID 79) through
$$$SwitchContextUserName$$$:
| Document | View of ROOT |
View of user 79 |
|---|---|---|
locked by |
|
|
locked by user |
|
|
externally locked |
|
|
free |
|
|
value stays the same in every row, only the two user-related texts swap. EXTERNAL and
UNLOCKED are identical in both views because they do not refer to a user.
5. Complete Example (HOL, measured response)
Excerpt of a HOL response from enaio® server 12.0.769.25242 for a document with all field
types, a table field, a variant and an attached file. Queried with
baseparams="1" fileinfo="1" status="1" rights="1" variants="1" object_inserts="1" remarks="1".
The field list is trimmed, everything else is unchanged.
<DMSContent format="HOL" output_language="0" version="12.0.769.25242"
timestamp="2026-09-25T12:01:57" user="ROOT" station="devel-uw-2026"
instance="__main__">
<Archive name="Unittest DMS" id="1" osguid="90F077D2CC264BA194997584DC423B23">
<ObjectType name="Dokument" id="262145" maintype="4" cotype="1"
osguid="8A6E3E8CDE6D4F4B90D05399E032EB20"
internal_name="Unittest_DMS_Document" type="DOCUMENT"
modul="MULTIDOC" table="object2">
<ObjectList>
<Object id="145156">
<Fields>
<Field value="0" name="lockuser" internal_name="OBJECT_LOCKUSER" system="1"
datatype="INTEGER" dbname="lockuser" ostype="9" osguid="1116"
size="10">UNLOCKED</Field>
<Field value="2" name="flags" internal_name="OBJECT_FLAGS" system="1"
datatype="INTEGER" dbname="flags" ostype="9" osguid="1102"
size="10">NOT_ARCHIVABLE</Field>
<Field name="Name" internal_name="Name" datatype="TEXT" dbname="feld1"
ostype="X" osguid="FE49BE50330C47E6BE385A33513CB547"
size="255">HOLDoc_2a3dfe80</Field>
<Field name="Date Field" internal_name="DateField" datatype="DATE"
dbname="datum1" ostype="D" osguid="55550F928F67497D8EA443D3802BA6F6"
size="10">17.03.2026</Field>
<Field value="1773754325" name="DateTime Field" internal_name="DateTimeField"
datatype="DATETIME" dbname="zahl1" ostype="9"
osguid="FFD713B64D4C44AF9F7D9981CECFBA52"
size="19">17.03.2026 14:32:05</Field>
<Field name="Double Field" internal_name="DoubleField" datatype="DECIMAL"
dbname="real1" ostype="#" osguid="80AFE59C1BF5482092AF4E2EF1EFF294"
size="15">1234.56</Field>
<!-- … further index and system fields … -->
</Fields>
<TableFields>
<TableField name="Table Field" internal_name="TableField" datatype="LIST"
dbname="list1" ostype="W"
osguid="9ABBD7483C06436E90BA7756F57A88C3" size="0">
<Columns>
<Column name="Table Col 1" internal_name="TableCol1" datatype="TEXT"
dbname="feld1" ostype="X"
osguid="FEDC8C33CB5B4970A47CE399D2964124" size="50">Table Col 1</Column>
<Column name="Table Col 2" internal_name="TableCol2" datatype="INTEGER"
dbname="zahl1" ostype="9"
osguid="A29522A908EB4AD091D41C2248E4D8F5" size="8">Table Col 2</Column>
</Columns>
<Row id="1">
<Value>Pos 1</Value>
<Value>3</Value>
</Row>
<Row id="2">
<Value>Pos 2</Value>
<Value>7</Value>
</Row>
</TableField>
</TableFields>
<Rights object_inserts="1" modify_index="1" delete_object="1"
export_object="1" modify_object="1"/>
<BaseParams>
<Creator>ROOT</Creator>
<Created value="1790330511">25.09.2026 12:01:51</Created>
<CreationDate>25.09.2026</CreationDate>
<Modifier>ROOT</Modifier>
<Modified value="1790330512">25.09.2026 12:01:52</Modified>
<Owner osguid="35100CD4D441420B90811DC90766D64F">ROOT</Owner>
<Links>0</Links>
<TxtNoticeCount>0</TxtNoticeCount>
<PdfAnnotationCount>0</PdfAnnotationCount>
<SystemID>0</SystemID>
<ForeignID></ForeignID>
<ArchiveState value="2">NOT_ARCHIVABLE</ArchiveState>
<Archivist>ROOT</Archivist>
<ArchiveDate>25.09.2026</ArchiveDate>
<Locked value="0">UNLOCKED</Locked>
<Version>1</Version>
<RetentionDate></RetentionDate>
<RetentionPlannedDate></RetentionPlannedDate>
<DocumentPageCount>0</DocumentPageCount>
</BaseParams>
<Remarks></Remarks>
<DocumentVariants>
<DocumentVariant is_active="1" doc_id="145156" doc_ver="Original" doc_parent="0">
<DocumentVariant is_active="0" doc_id="145160" doc_ver="1.0.0"
doc_parent="145156"/>
</DocumentVariant>
</DocumentVariants>
<FileProperties count="1" size="25" extension="txt" mimetype="text/plain"
mimetypegroup="TXT" iconid="1073743978"/>
</Object>
</ObjectList>
<Statistics startpos="0" pagesize="-1" total_hits="1"/>
</ObjectType>
</Archive>
<Messages></Messages>
</DMSContent>
Observations that can be read off this response:
-
The order inside
<Object>is<Fields>,<TableFields>,<Rights>,<BaseParams>,<Remarks>,<DocumentVariants>,<FileProperties>— followed, for folders and registers, by<ChildObjects>. -
System fields carry
system="1"and deliver the translated text as content, the raw value in thevalueattribute (value="2"forNOT_ARCHIVABLE). -
Empty values appear as an empty element, not as a missing one (
<RetentionDate>). -
<Remarks>is present even without a stored note, as soon asremarks="1"is set. -
<Statistics>sits per<ObjectType>, not per<Archive>. -
osguidis a 32-character hexadecimal string without separators; for system fields it holds a short numeric ID instead (1116).
6. Deviations Between Schema and Server Behaviour
At the following points, the DMSContent.xsd as shipped by the manufacturer describes something
other than what the server actually sends. Measured against enaio® server 12.0.769.25242. The
schema version maintained with this documentation is corrected at every point listed (see
Corrected Schema Files).
| Location | Shipped schema | Server behaviour (measured) |
|---|---|---|
|
Text content only |
Carries the full |
|
|
Sends |
Document part of |
Mandatory, ends after |
Present for documents only; additionally |
|
Additionally |
|
Not declared |
Sent on every object when |
|
|
|
|
|
Declared without attributes |
Carries |
Only |
Carries the full |
|
|
Required attributes |
Are not sent, not even for an object that carries a file |