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

dms.GetResultList

LOL / HOL / MIXED

Primary research job — returns hit lists from search queries

dms.GetObjectDetails

HOL

Returns complete index data for one or more objects

dms.ExecuteStoredQuery

LOL / HOL

Executes a stored search query

dms.GetUserTrayObjects

HOL

Returns typeless objects from the user tray (contains <TypelessObjects>)

dms.GetWorkflowObjects

HOL

Returns objects from the workflow tray

dms.GetDeletedObjects

HOL

Returns deleted objects

dms.GetForeignObjects

HOL

Returns linked objects from other archives

dms.GetShadowData

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>

LOL

List of Lists

<Rowset> with <Columns> (field definitions) + <Rows> (hit values) — tabular

HOL

Hierarchical Object List

<ObjectList> with <Object> elements containing <Fields>, <BaseParams> etc.

MIXED

Combination

Contains both <Rowset> and <ObjectList> structures

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

format

dataformat

Required

Output format: LOL, HOL or MIXED

system_id

xs:long

-1

Internal system ID of the server

lang_id

xs:long

7

Language ID (7 = German)

user

xs:string

—

Logged-in user

station

xs:string

—

Computer/station name of the user

timestamp

xs:dateTime

—

Time of response (ISO 8601)

version

xs:string

5.00

enaio® server version

instance

xs:string

—

Server instance

output_language

xs:string

0

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

id

xs:long

-1

Numeric archive ID

name

xs:string

—

Display name of the archive

internal_name

xs:string

—

Internal name of the archive

osguid

xs:string

—

GUID of the archive

3.3. <ObjectType>

Describes the object type of the contained hits.

Attribute Type Default Description

type

objecttypes

—

Type of the object: FOLDER, REGISTER or DOCUMENT

id

xs:long

-1

Numeric ID of the object type

maintype

xs:short

-1

Main type of the object type. Value range and meaning: Object Type ID.

cotype

xs:short

-1

Subtype of the object type (lowword of the object type ID).

table

xs:string

—

Database table of the object type

name

xs:string

—

Display name of the object type

internal_name

xs:string

—

Internal name of the object type

osguid

xs:string

—

GUID of the object type

modul

modultype

UNKNOWN

Document module (only relevant for documents)

encrypted

xs:short

0

1 = objects of this type are encrypted

alias

xs:string

—

Alias name of the object type

fulltext

xs:short

0

1 = full-text index available

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

id

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)

value

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

id

xs:long

Yes

Object ID

export_depth

xs:long

—

Export depth (for nested queries)

Child elements of <Object> (all optional):

Element Content

<Fields>

Simple index fields as <Field> list (Field element)

<MultiFields>

Multi-fields (MultiFields)

<TableFields>

Table fields (TableFields)

<Rights>

Access rights of the logged-in user for this object (Rights)

<BaseParams>

Base parameters (creator, modification date, archiving status etc.) (BaseParams)

<Remarks>

Notes on the object (Remarks)

<DocumentVariants>

Document variants (only for documents with variants) (DocumentVariants)

<FileProperties>

File information (FileProperties)

<ChildObjects>

Child objects (for folders/registers with substructure) — contains further <ObjectType> elements

<ExternalObjects>

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)

value

xs:string

—

Internal raw value (for catalog fields: key)

displayname

xs:string

—

Display name of the field (field label from the object type)

name

xs:string

—

Display name of the field

internal_name

xs:string

—

Internal (technical) name of the field

dbname

xs:string

—

Database column name

osguid

xs:string

—

GUID of the field

object

xs:string

—

Associated object type (for cross-field queries)

system

xs:short

0

1 = system field

type

xs:string

—

Field type (internal, e.g. BOOL, DATE, DECIMAL, TEXT)

datatype

xs:string

—

Database data type

ostype

xs:string

—

enaio® field data type — see ostype codes

size

xs:long

—

Field length in characters

visible

xs:short

1

1 = field is visible, 0 = hidden

sortpos

xs:long

-1

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

0

SMALLINT

CheckboxField

1

SMALLINT

GroupField, RadioField1

9

DATETIME

DateTime, DateTimeField

9

INTEGER

ID, OSID, Ziffern

9

TIME

Time, TimeField

A

TEXT

Characters

D

DATE

Date, DateField

G

TEXT

UpperCharacters

P

TEXT

asf

Q

TEXT

Yes_No

R

TEXT

FieldRightGroupControls

S

TEXT

mwd

T

TEXT

lr

W

LIST

TableField (table field)

X

TEXT

AllCharacters, AutoProposals, CatalogAddon

Z

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".

<Page id="n"> counts the files on the object, not the pages inside a file. Permitted is 1 to FileProperties/@count; the count is 1-based and id="0" is always rejected. A page number outside that range is answered by the server on write with:

-1042611991 During insertion of a value into multi-field <Name>, the given page number was
            found to be out of the allowed range.

What counts is not <DocumentPageCount>. A document holding a single three-page PDF has DocumentPageCount 3 but count 1 — only page 1 is writable there. Conversely a document with three attached files carries count 3 and DocumentPageCount 0, and pages 1 to 3 are writable. Timing makes no difference either: once the page count of the PDF had been determined, pages 2 and 3 were still rejected.

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:

  • While a client edits a multi-field, the corresponding database table is locked. Other accesses to the same document wait, without the reason being apparent to them.

  • The enaio® webclient does not support multi-fields.

  • Importing multi-field data is possible through the TEXT/ASCII format only, with a separate file per multi-field.

The manufacturer therefore recommends using multi-fields sparingly; for most use cases a table field achieves the same.

Attribute on <MultiField> Type Description

name

xs:string

Display name of the multi-field

internal_name

xs:string

Internal name

dbname

xs:string

Database column name

osguid

xs:string

GUID of the field

datatype

xs:string

Database data type — measured TEXT

ostype

xs:string

enaio® field data type — measured X (ostype codes)

size

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.
Example 1. Measured example

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

modify_index

xs:short

0

1 = user may change index data

modify_object

xs:short

0

1 = user may edit the object

delete_object

xs:short

0

1 = user may delete the object

export_object

xs:short

0

1 = user may export the object

object_inserts

xs:short

0

1 = user may insert child objects

<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

type

xs:long

Yes

Object Type ID

count

xs:long

Yes

Remaining allowed instances (-1 = unlimited)

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>

Creator user name

<Created value="unix-ts">

Creation time as formatted string; attribute value = Unix timestamp

<CreationDate>

Creation date without time

<Modifier>

Last modifier user name

<Modified value="unix-ts">

Modification time; attribute value = Unix timestamp

<Owner osguid="…​">

Owner (user name as text, GUID as attribute)

<Links>

Number of links to this object

<TxtNoticeCount>

Number of text notices on the object

<PdfAnnotationCount>

Number of PDF annotations on the object

<SystemID>

System ID (for reference documents)

<ForeignID>

Foreign ID (for reference documents from external systems)

<ArchiveState value="n">

Archiving status as text (ArchiveStateType) + numeric value as attribute

<Archivist>

User name of the archiver. Filled on non-archived documents as well — with the creating user in that case (see ArchiveStateType)

<ArchiveDate>

Date of archiving. Filled on non-archived documents as well — with the creation date in that case

<Locked value="n">

Checkout status as text (LockedType) + numeric value as attribute

<Version>

Version number of the object

<RetentionDate>

End of the retention period

<RetentionPlannedDate>

Planned end of the retention period

<DocumentPageCount>

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. type carries the colour, <Text> the note text.

  • Note link (relation="1") — a link to another object. type is 0, id is 0, medium is 0, and <Creator>, <Created>, <Modifier>, <Modified> and <Text> stay empty. The link appears on both objects involved, distinguished by relationdirection.

Attribute on <Remark> Type Description

id

xs:long

Note ID. 0 for a note link

type

xs:short

Colour of the object note: 1 = WHITE, 2 = YELLOW, 3 = GREEN, 4 = BLUE. 0 for a note link. Corresponds to the color attribute of <RemarkText> when writing

relation

xs:short

0 = object note, 1 = note link

relationdirection

xs:short

Only for relation="1": 0 on the linking object, 1 on the linked object

relatedobjectid

xs:long

Only for relation="1": object ID of the other side

relatedobjecttype

xs:long

Only for relation="1": object type ID of the other side (object type ID)

medium

xs:long

Medium ID of the note file; 0 for a note link. See the warning below the table

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 id="n">

Creator name, user ID in the id attribute

<Created value="n">

Creation date as formatted text, Unix timestamp in the value attribute

<Modifier id="n">

Last editor, user ID in the id attribute

<Modified value="n">

Date of the last change, Unix timestamp in the value attribute

<Text id="…">

Note text. Filled for the object note, empty for the note link. Under database storage the id attribute carries the textid of the text in osremarktext; under file-system storage it stays empty

<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

doc_id

xs:long

Yes

Object ID of this variant

doc_parent

xs:long

Yes

Object ID of the parent variant (0 for the root variant)

doc_ver

xs:string

Yes

Version label. The root variant carries Original, derived variants a three-part number (e.g. 1.0.0)

is_active

xs:short

Yes

1 = active variant

3.5.10. <FileProperties>

Properties of the file stored with the document. Empty element, all information is in attributes.

Attribute Type Description

extension

xs:string

File extension without dot (e.g. docx)

mimetype

xs:string

MIME type of the file

mimetypegroup

xs:string

Group of the file type as an upper-case token (enaio®-specific, not the MIME main type) — see measured values

count

xs:long

Number of files of the document

size

xs:long

File size in bytes

iconid

xs:long

ID of the file icon

documentpagecount

xs:long

Page count of the document. Appears only when the page count is greater than 0 — which, immediately after the import, is not yet the case even for a document that has pages

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

pdf

application/pdf

PDF

1073743982

jpg

image/jpeg

IMAGE

1073743984

docx

application/vnd.openxmlformats-officedocument.wordprocessingml.document

WORD

1073743959

xlsx

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

EXCEL

1073744006

txt

text/plain

TXT

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

id

xs:long

Yes

Object ID

maintype

xs:short

Yes

Document main type. Values and meaning: Object Type ID.

module

modultype

Yes

Document module

user

xs:string

Yes

Owner user name

pagecount

xs:long

—

Number of pages

filesize

xs:long

—

File size in bytes

mimetypeid

xs:long

—

MIME type ID

timestamp

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.
Creating and removing a typeless object

A typeless object is created via dms.XMLInsert with Options="INUSERTRAY=1;TYPELESS=1", a file, and a body without index data:

<DMSData>
  <Archive internal_name="Unittest_DMS">
    <ObjectType type="DOCUMENT">
      <Object maintype="4"/>
    </ObjectType>
  </Archive>
</DMSData>

The main type has to be on the <Object>. On the <ObjectType> it is not evaluated for this case, although DMSData lists the attribute in both places.

Failed attempt Server response

Body with <Fields>

-1042610069 — "The document should be sent to the DMS without type, but index data have been specified for the document."

maintype on the <ObjectType> only

-1042611918 — "The document should be added without type to the workflow or user tray, but no main type was specified."

It is removed via dms.XMLDelete, likewise with Options="INUSERTRAY=1;TYPELESS=1" and <Object object_id="…" maintype="4"/>. Without TYPELESS=1 the server answers with -1042610059 — "There is not enough information to identify the object type."

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 <Messages> is empty. The server reports errors through the return value of the job, not through this block.

Measured against enaio® server 12.0.769.25242 across 30 captured responses covering HOL, LOL, user tray, sql="1", external archive, typeless objects, archived documents and three user sessions: <Messages></Messages> without exception. Eight targeted attempts to provoke content also came back empty — a full-text condition without a full-text engine, maxhits smaller than the result set, a condition without hits, two <Archive> blocks one of which returns nothing, <LinkedValue> with an unresolvable ref, an unknown field name in <Fields>, sortpos on an unknown field, and an invalid field_schema value.

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 <Messages> does not occur in any measured case. Which constellation fills the block is therefore unproven — a consumer should not rely on finding warnings here.

Attribute Type Required Description

Text content

xs:string

—

Description of the error

faultcode

xs:long

Yes

Internal error code

sourcecode

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

pagesize

xs:long

Yes

Maximum number of hits per page (configured in the request)

startpos

xs:long

Yes

Start position (0-based) of the first returned hit

total_hits

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

LOL

List of Lists — tabular format with <Rowset>

HOL

Hierarchical Object List — object format with <ObjectList>

MIXED

Combination of LOL and HOL

4.2. objecttypes

Value Meaning

FOLDER

Folder

REGISTER

Register

DOCUMENT

Document

4.3. modultype

Value Main type Description

GRAYSCALE

1

Grayscale document

BLACKWHITE

2

Black/White document

COLOR

3

Color document

WINDOWS

4

Windows document (Office, PDF, …)

MULTIMEDIA

5

Multimedia document

EMAIL

6

Email document

XML

7

XML document

CONTAINER

8

Container document

MULTIDOC

—

Multi-page composite document

REFERENCE

—

Reference document (reference to external system)

UNKNOWN

—

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

ARCHIVABLE

0x00000001 (1)

Document can be archived (released)

NOT_ARCHIVABLE

0x00000002 (2)

Document cannot be archived

NO_PAGES

0x00000008 (8)

Document has no pages

ARCHIVED

0x00000010 (16)

Document is archived

PAGE_ERROR

—

Error with one or more pages

REFERENCE

—

Reference document — no own archive

UNKNOWN

—

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.
Example 2. Timing after the import

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

0, attribute documentpagecount absent

ARCHIVABLE

after 2 minutes

2

ARCHIVABLE

after 5 and after 10 minutes

2

ARCHIVED

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

UNLOCKED

Document is not checked out

SELF

Document is checked out by the user of the querying session

OTHERS

Document is checked out by another user

EXTERNAL

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.

Example 3. Measured against enaio® server 12.0.769.25242

Four documents in one response, queried from the session of ROOT (user ID 2):

Text content value How produced

UNLOCKED

0

unchanged, and after dms.UndoCheckOutDocument

EXTERNAL

1

dms.CheckOutDocument with Flags=1

SELF

2

dms.CheckOutDocument with Flags=0 by ROOT — 2 is that user’s ID

OTHERS

79

checkout by a second user with the ID 79

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 ROOT

<Locked value="2">SELF</Locked>

<Locked value="2">OTHERS</Locked>

locked by user 79

<Locked value="79">OTHERS</Locked>

<Locked value="79">SELF</Locked>

externally locked

<Locked value="1">EXTERNAL</Locked>

<Locked value="1">EXTERNAL</Locked>

free

<Locked value="0">UNLOCKED</Locked>

<Locked value="0">UNLOCKED</Locked>

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 the value attribute (value="2" for NOT_ARCHIVABLE).

  • Empty values appear as an empty element, not as a missing one (<RetentionDate>).

  • <Remarks> is present even without a stored note, as soon as remarks="1" is set.

  • <Statistics> sits per <ObjectType>, not per <Archive>.

  • osguid is 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)

<Column> of a LOL table field

Text content only

Carries the full field_ident attribute group, as in the HOL RowsetType

BaseParamsType

<Links> directly followed by <SystemID>

Sends <TxtNoticeCount> and <PdfAnnotationCount> in between

Document part of <BaseParams>

Mandatory, ends after <Version>

Present for documents only; additionally <RetentionDate>, <RetentionPlannedDate> and <DocumentPageCount>

<FileProperties>

extension, mimetype, count, size

Additionally mimetypegroup, iconid and documentpagecount. mimetypegroup carries an upper-case token (PDF, IMAGE, WORD, EXCEL, TXT), not the MIME main type; documentpagecount appears only for a page count greater than 0

<Remarks>

Not declared

Sent on every object when remarks="1" is set, between <BaseParams> and <DocumentVariants>, with <Remark> child elements for object notes and note links

doc_parent on <DocumentVariant>

-1 on the root variant

0 on the root variant

<Archive> inside <ExternalObjects>

Declared without attributes

Carries name, id and osguid just like the top-level <Archive>

<MultiField>

Only dbname, name and internal_name

Carries the full field_ident attribute group like <Field>

pagecount, filesize, mimetypeid on <TypelessObject>

Required attributes

Are not sent, not even for an object that carries a file