DMSContent XML-Format
Das DMSContent-Format ist das primäre Ausgabeformat des enaio®-Servers für Suchergebnisse und Objektabrufe. Es wird von den Recherche- und Abruf-Jobs der DMS-Engine zurückgeliefert.
Die zugehörige Schema-Datei ist DMSContent.xsd.
Das Format kann entweder als LOL (lineare Trefferliste), als HOL (hierarchische Objektliste)
oder als MIXED (Kombination aus beiden) vorliegen — gesteuert durch das Attribut format am Wurzelelement.
1. Verwendung
Das DMSContent-Format wird von folgenden Jobs zurückgeliefert:
| Job | Format | Beschreibung |
|---|---|---|
LOL / HOL / MIXED |
Primärer Recherche-Job — gibt Trefferlisten aus Suchanfragen zurück |
|
HOL |
Liefert vollständige Indexdaten zu einem oder mehreren Objekten |
|
LOL / HOL |
Führt eine gespeicherte Suchanfrage aus |
|
HOL |
Liefert typloser Objekte aus der Benutzerablage (enthält |
|
HOL |
Liefert Objekte aus der Workflowablage |
|
HOL |
Liefert gelöschte Objekte |
|
HOL |
Liefert verknüpfte Objekte aus anderen Archiven |
|
HOL |
Liefert Indexdaten im HOL-Format |
2. Ausgabeformate (LOL vs. HOL)
Das Attribut format am <DMSContent>-Element bestimmt die interne Struktur der Ergebnisse:
| Wert | Format | Struktur innerhalb von <ObjectType> |
|---|---|---|
|
Liste von Listen |
|
|
Hierarchische Objektliste |
|
|
Kombination |
Enthält sowohl |
2.1. LOL — Lineare Trefferliste
Die LOL-Struktur ist das kompakte tabellarische Format: Spalten werden einmalig definiert, dann folgen die Trefferzeilen. Geeignet für große Ergebnismengen und einfache Felder.
<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">Datum</Column>
<Column internal_name="subject" dbname="D002" type="TEXT" ostype="TEXT">Betreff</Column>
<Column internal_name="physician" dbname="D003" type="TEXT" ostype="TEXT">Arzt</Column>
</Columns>
<Rows>
<Row id="9823">
<Value>2024-03-15</Value>
<Value>Entlassungsbrief</Value>
<Value>Dr. Müller</Value>
</Row>
<Row id="9824">
<Value>2024-03-10</Value>
<Value>Aufnahmedokumentation</Value>
<Value>Dr. Schmidt</Value>
</Row>
</Rows>
</Rowset>
<Statistics pagesize="20" startpos="0" total_hits="42"/>
</ObjectType>
</Archive>
<Messages/>
</DMSContent>
2.2. HOL — Hierarchische Objektliste
Die HOL-Struktur liefert vollständige Objektdaten pro Instanz. Jedes <Object> enthält
Felder, Basisparameter, Rechteinformationen sowie optional Kinderobjekte und Varianten.
<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">Entlassungsbrief</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. Elemente und Attribute
3.1. <DMSContent> (Wurzelelement)
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
Pflicht |
Ausgabeformat: |
|
|
xs:long |
|
Interne System-ID des Servers |
|
xs:long |
|
Sprachkennung (7 = Deutsch) |
|
xs:string |
— |
Angemeldeter Benutzer |
|
xs:string |
— |
Rechner-/Stationsname des Benutzers |
|
xs:dateTime |
— |
Zeitpunkt der Antwort (ISO 8601) |
|
xs:string |
|
enaio®-Serverversion |
|
xs:string |
— |
Serverinstanz |
|
xs:string |
|
Ausgabesprache (0 = Serverstandard) |
Kindelemente:
-
<Archive>(0..*) — Archivcontainer mit Treffern -
<TypelessObjects>(0..1) — Typloser Objekte (nur bei bestimmten Jobs) -
<Messages>(1) — Fehlermeldungen (leer wenn erfolgreich)
3.2. <Archive>
Gruppiert Treffer nach Archiv. Wird für jedes Archiv, das Treffer enthält, einmal ausgegeben.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
xs:long |
|
Numerische Archiv-ID |
|
xs:string |
— |
Anzeigename des Archivs |
|
xs:string |
— |
Interner Name des Archivs |
|
xs:string |
— |
GUID des Archivs |
3.3. <ObjectType>
Beschreibt den Objekttyp der enthaltenen Treffer.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
— |
Art des Objekts: |
|
|
xs:long |
|
Numerische ID des Objekttyps |
|
xs:short |
|
Haupttyp des Objekttyps. Wertebereich und Bedeutung: Objekttyp-ID. |
|
xs:short |
|
Untertyp des Objekttyps (Lowword der Objekttyp-ID). |
|
xs:string |
— |
Datenbanktabelle des Objekttyps |
|
xs:string |
— |
Anzeigename des Objekttyps |
|
xs:string |
— |
Interner Name des Objekttyps |
|
xs:string |
— |
GUID des Objekttyps |
|
|
Dokumentmodul (nur bei Dokumenten relevant) |
|
|
xs:short |
|
|
|
xs:string |
— |
Alias-Name des Objekttyps |
|
xs:short |
|
|
Kindelemente:
-
Entweder
<Rowset>(LOL) oder<ObjectList>(HOL) -
Optional
<SQL>— das ausgeführte SQL-Statement -
<Statistics>— Trefferstatistik (immer vorhanden)
3.3.1. <SQL>
Das vom Server erzeugte und ausgeführte SQL-Statement, als Textinhalt eines <Select>-Elements.
Wird geliefert, wenn die Anfrage sql="1" am
<DMSQuery>-Element setzt. Der Block steht je
<ObjectType> zwischen dem Ergebnis (<Rowset> beziehungsweise <ObjectList>) und
<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>
Der Join über die Relationstabelle sdrel und das DISTINCT sind der Grund, warum ein Objekt mit
mehreren Ablageorten nur einmal im Ergebnis erscheint. Die Klausel
(d.deleted is NULL or d.deleted=0) zeigt, dass der Server beide Ausprägungen von
OBJECT_DELETED als „nicht gelöscht" behandelt.
Wie Bedingungen in SQL übersetzt werden — insbesondere die Platzhalter — steht bei Platzhalter in Textbedingungen.
3.4. <Rowset> (LOL)
Enthält das tabellarische Suchergebnis. Spalten werden einmalig in <Columns> definiert,
die Datenwerte folgen in <Rows>.
3.4.1. <Columns> / <Column>
<Columns> enthält <Column>-Elemente für jede zurückgegebene Spalte sowie optional
<TableField>-Elemente für Tabellenfelder.
<Column> trägt den Feldnamen als Textinhalt und die vollständige Felddefinition als Attribute (field_ident).
Die <Column>-Elemente innerhalb eines <TableField> tragen dieselbe Attributgruppe. Das
ausgelieferte Hersteller-Schema beschreibt sie an dieser Stelle nur als Text — der Server liefert
auch dort die vollständige Felddefinition. Für das HOL-Format beschreibt dasselbe Schema es im
RowsetType bereits korrekt (siehe Abweichungen zwischen Schema und Serververhalten).
|
3.4.2. <Rows> / <Row> / <Value>
Jede <Row> entspricht einem Treffer-Objekt.
Attribut auf <Row> |
Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
xs:long |
— |
Objekt-ID des Treffers |
Die <Value>-Elemente innerhalb einer <Row> entsprechen positionsgenau den Spalten aus <Columns>.
Attribut auf <Value> |
Typ | Standard | Beschreibung |
|---|---|---|---|
Textinhalt |
xs:string |
— |
Anzeigewert des Feldinhalts (formatiert/übersetzt) |
|
xs:string |
— |
Interner Rohwert (z. B. Schlüssel eines Katalogfelds) |
Bei Katalogfeldern enthält der Textinhalt den Anzeigenamen (z. B. männlich), das Attribut value den internen Schlüssel (z. B. M). Für programmatische Verarbeitung sollte value verwendet werden.
|
Tabellenfelder erscheinen als <TableField>-Kindelement in der <Row> (parallel zu den <Value>-Elementen).
3.4.3. Gemessenes Beispiel
Ausschnitt einer LOL-Antwort von enaio®-Server 12.0.769.25242 auf einen Dokumenttyp mit
Tabellenfeld, gekürzt auf drei Ergebnisspalten und einen Treffer. Zu beachten: das
<TableField> steht in <Columns> und in jeder <Row>, <Value> trägt bei übersetzten
Werten den Rohwert im Attribut value, ein leerer Wert erscheint als leeres Element, und
<Rights> steht je Treffer am Ende der <Row>.
<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>
<!-- … weitere Ergebnisspalten … -->
<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>
Der Spaltentext ist der interne Name des Felds (OBJECT_VERID), nicht der Anzeigename; dieser
steht im Attribut name. Bei den Spalten eines Tabellenfelds ist es umgekehrt der Anzeigename
(Table Col 1).
3.5. <ObjectList> (HOL)
Enthält eine Liste von <Object>-Elementen mit vollständigen Objektdaten.
3.5.1. <Object>
| Attribut | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
xs:long |
Ja |
Objekt-ID |
|
xs:long |
— |
Exporttiefe (bei verschachtelten Abfragen) |
Kindelemente von <Object> (alle optional):
| Element | Inhalt |
|---|---|
|
Einfache Indexfelder als |
|
Mehrfachfelder (MultiFields) |
|
Tabellenfelder (TableFields) |
|
Zugriffsrechte des angemeldeten Benutzers für dieses Objekt (Rights) |
|
Basisparameter (Ersteller, Änderungsdatum, Archivierungsstatus etc.) (BaseParams) |
|
Notizen am Objekt (Remarks) |
|
Variantendokumente (nur bei Dokumenten mit Varianten) (DocumentVariants) |
|
Dateiinformationen (FileProperties) |
|
Kinderobjekte (bei Ordnern/Registern mit Unterstrukturen) — enthält weitere |
|
Verknüpfte Objekte aus anderen Archiven (ExternalObjects) |
3.5.2. <Fields> / <Field>
<Fields> enthält <Field>-Elemente, eines pro Indexfeld.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
Textinhalt |
xs:string |
— |
Anzeigewert des Felds (formatiert) |
|
xs:string |
— |
Interner Rohwert (bei Katalogfeldern: Schlüssel) |
|
xs:string |
— |
Anzeigename des Felds (Feldbezeichnung aus dem Objekttyp) |
|
xs:string |
— |
Anzeigename des Felds |
|
xs:string |
— |
Interner (technischer) Name des Felds |
|
xs:string |
— |
Datenbankspaltname |
|
xs:string |
— |
GUID des Felds |
|
xs:string |
— |
Zugehöriger Objekttyp (bei feldübergreifenden Abfragen) |
|
xs:short |
|
|
|
xs:string |
— |
Feldtyp (intern, z. B. |
|
xs:string |
— |
Datenbankdatentyp |
|
xs:string |
— |
enaio®-Felddatentyp — siehe |
|
xs:long |
— |
Feldlänge in Zeichen |
|
xs:short |
|
|
|
xs:long |
|
Sortierposition des Felds in der Maske |
ostype-Codes
Der Code steht an <Field>, <Column> und <TableField> und bezeichnet den Felddatentyp der
Objektdefinition. Gemessen an enaio®-Server 12.0.769.25242 über drei Kabinette und neun
Objekttypen, gelesen aus den <Columns>-Blöcken von LOL-Antworten — diese beschreiben die
Ergebnisspalten und kommen unabhängig davon, ob die Abfrage Treffer hat.
ostype |
datatype |
Beispielfelder |
|---|---|---|
|
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 (Tabellenfeld) |
|
TEXT |
AllCharacters, AutoProposals, CatalogAddon |
|
TEXT |
ZiffernAlpha |
Die Zuordnung ist nicht eindeutig. 9 steht für DATETIME, INTEGER und TIME; mehrere
Buchstaben stehen für TEXT. Der datatype allein bestimmt den Felddatentyp also nicht, und
umgekehrt. Für eine eindeutige Auswertung sind beide Attribute heranzuziehen.
|
| Die Tabelle listet, was auf dem Messsystem existiert. Ob weitere Codes vorkommen, ist offen — dafür wäre ein Objekttyp nötig, der jeden in der Objektdefinition möglichen Feldtyp einmal enthält. |
3.5.3. <MultiFields> / <MultiField> / <Page> / <Value>
Mehrfachfelder indexieren jede gespeicherte Seite eines Dokuments einzeln. Sie sind nur an Dokumenttypen möglich und in der Objektdefinition einem eigenen Maskenbereich zugeordnet; als Datenbankfeldtyp gilt „alle Zeichen".
|
Maßgeblich ist nicht Ein Aufrufer, der von der Seitenzahl im PDF ausgeht, rechnet also falsch. |
Mehrfachfelder werden nur bei HOL-Anfragen geliefert. In einer LOL-Antwort fehlen sie
vollständig — auch dann, wenn das Feld namentlich in den
<Fields> angefordert wird; es erscheint dort weder als
<MultiFields>-Block noch als Spalte.
|
<MultiFields>
<MultiField internal_name="keywords" dbname="D010">
<Page id="1">
<Value>Rechnung</Value>
<Value>2024</Value>
</Page>
</MultiField>
</MultiFields>
|
Beim Einsatz von Mehrfachfeldern ist mehreres zu beachten:
Der Hersteller empfiehlt daher, Mehrfachfelder zurückhaltend einzusetzen; für die meisten Anwendungsfälle leistet ein Tabellenfeld dasselbe. |
Attribut an <MultiField> |
Typ | Beschreibung |
|---|---|---|
|
xs:string |
Anzeigename des Mehrfachfelds |
|
xs:string |
Interner Name |
|
xs:string |
Datenbankspaltname |
|
xs:string |
GUID des Felds |
|
xs:string |
Datenbankdatentyp — gemessen |
|
xs:string |
enaio®-Felddatentyp — gemessen |
|
xs:long |
Feldlänge in Zeichen |
Das ausgelieferte Hersteller-Schema deklariert an <MultiField> nur dbname, name und
internal_name. Der Server sendet dort dieselbe vollständige Attributgruppe wie an <Field> —
derselbe Befund wie bei den Spalten eines LOL-Tabellenfelds.
|
Ein Dokument mit drei angehängten Dateien (FileProperties/@count 3), angelegt über
dms.XMLInsert und gelesen mit 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>
Eine <Page> kann also mehrere <Value> tragen; das dokumentierte TEXT/ASCII-Importformat mit
genau einem Indexwert je Seite bildet nicht den vollen Funktionsumfang der XML-Schnittstelle ab.
Geschrieben wird ein Mehrfachfeld über dms.XMLInsert und
dms.XMLUpdate. Beim Update ersetzt ein Schreibvorgang den Wert der
angegebenen Seite; die Option REPLACEMULTIFIELDS
steuert das Verhältnis von Ersetzen zu Anhängen, nicht den erlaubten Seitenbereich — dieser gilt
unverändert auch für das Update.
Wird das Mehrfachfeld zusätzlich als <Field> in den
<Fields> der Anfrage aufgeführt, während
field_schema="ALL" gilt, liefert der Server den kompletten <MultiField>-Block doppelt —
inhaltlich identisch. Ohne die ausdrückliche Nennung kommt er einmal. Eine Auswertung sollte
<MultiField> daher über internal_name deduplizieren.
|
| Die fachlichen Angaben zu Maskenbereich, Sperrverhalten und Importformat stammen aus der Herstellerdokumentation zu enaio® 10.x und 11.x und sind nicht gemessen. Gemessen sind Aufbau und Attribute der Antwort sowie das Verhalten bei doppelter Nennung. |
3.5.4. <TableFields> / <TableField>
Tabellenfelder im HOL-Format folgen dem RowsetType: <Columns>/<Column>+ definiert die Spalten,
<Row id>/<Value>* enthält die Zeilen.
<TableFields>
<TableField internal_name="positions" dbname="D020">
<Columns>
<Column internal_name="pos_nr" dbname="D021">Pos.</Column>
<Column internal_name="description" dbname="D022">Bezeichnung</Column>
<Column internal_name="amount" dbname="D023">Betrag</Column>
</Columns>
<Row id="1">
<Value>1</Value>
<Value>Beratung</Value>
<Value>1200.00</Value>
</Row>
<Row id="2">
<Value>2</Value>
<Value>Reisekosten</Value>
<Value>350.00</Value>
</Row>
</TableField>
</TableFields>
3.5.5. <Rights>
Zugriffsrechte des aktuell angemeldeten Benutzers für das Objekt.
| Attribut | Typ | Standard | Beschreibung |
|---|---|---|---|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
|
xs:short |
|
|
<Rights> kann <ObjectInserts>-Kindelemente enthalten, die angeben, wie viele Objekte eines bestimmten Typs unterhalb noch eingefügt werden dürfen:
Attribut auf <ObjectInserts> |
Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
xs:long |
Ja |
|
|
xs:long |
Ja |
Verbleibende erlaubte Instanzen ( |
Gemessen an enaio®-Server 12.0.769.25242, an einem Ordner mit object_inserts="1": es kommt ein
<ObjectInserts> je erlaubtem Kindtyp, auch mit count="0", wenn dort aktuell nichts liegt.
<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> erscheint nur, wenn die Anfrage object_inserts="1" setzt. An Dokumenten
bleibt <Rights> leer, weil unterhalb eines Dokuments keine Objekte eingefügt werden können.
|
3.5.6. <BaseParams>
Basisparameter sind Systemmetadaten, die für jedes Objekt existieren.
| Element | Beschreibung |
|---|---|
|
Benutzername des Erstellers |
|
Erstellzeitpunkt als formatierter String; Attribut |
|
Erstelldatum ohne Uhrzeit |
|
Benutzername des letzten Änderers |
|
Änderungszeitpunkt; Attribut |
|
Besitzer (Benutzername als Text, GUID als Attribut) |
|
Anzahl der Verknüpfungen dieses Objekts |
|
Anzahl der Text-Notizen am Objekt |
|
Anzahl der PDF-Annotationen am Objekt |
|
System-ID (für Verweisdokumente) |
|
Fremd-ID (für Verweisdokumente aus Fremdsystemen) |
|
Archivierungsstatus als Text (ArchiveStateType) + numerischer Wert als Attribut |
|
Benutzername des Archivierenden. Auch an nicht archivierten Dokumenten gefüllt — dann mit dem anlegenden Benutzer (siehe ArchiveStateType) |
|
Datum der Archivierung. Auch an nicht archivierten Dokumenten gefüllt — dann mit dem Anlagedatum |
|
Checkout-Status als Text (LockedType) + numerischer Wert als Attribut |
|
Versionsnummer des Objekts |
|
Ende der Aufbewahrungsfrist |
|
Geplantes Ende der Aufbewahrungsfrist |
|
Seitenanzahl des Dokuments |
Der dokumentspezifische Teil — von <ArchiveState> bis <DocumentPageCount> — wird nur für
Dokumente geliefert. Bei Ordnern und Registern enden die <BaseParams> nach <ForeignID>.
Die Elemente <TxtNoticeCount>, <PdfAnnotationCount>, <RetentionDate>,
<RetentionPlannedDate> und <DocumentPageCount> fehlen im ausgelieferten Hersteller-Schema,
werden vom Server aber gesendet.
|
3.5.7. <ExternalObjects>
Ergebnis einer archivübergreifenden Abfrage
(<ExternalObjects> in der DMSQuery). Steht innerhalb
des <Object>-Elements des Hauptobjekts, also je Treffer der Hauptabfrage, und enthält
darunter dieselbe Struktur wie eine gewöhnliche Antwort:
<ExternalObjects> → <Archive> → <ObjectType> → <ObjectList> → <Object> plus eine
eigene <Statistics> je Fremd-<ObjectType>.
Das verschachtelte <Archive> trägt dieselben Identifikationsattribute wie das <Archive> der
obersten Ebene (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>
Lässt sich die Bedingung des Fremdarchivs nicht auflösen — etwa weil ein
<LinkedValue ref="…"/> auf einen nicht vergebenen Alias zeigt — bleibt die <ObjectList> leer
und total_hits steht auf 0. Einen Hinweis darauf gibt der Server nicht; <Messages> bleibt
leer.
|
3.5.8. <Remarks>
Notizen am Objekt. Wird genau dann geliefert, wenn die Anfrage das Attribut remarks="1" am
<DMSQuery>-Element setzt, und steht dann an jedem Objekt —
auch an Ordnern und Registern und auch dann, wenn keine Notiz hinterlegt ist. Ohne das Attribut
fehlt das Element ganz.
Position: direkt nach <BaseParams>, vor <DocumentVariants> beziehungsweise <ChildObjects>.
Jede Notiz steht als <Remark>-Element darin. Es gibt zwei Ausprägungen, unterschieden durch
relation:
-
Objektnotiz (
relation="0") — eine farbige Textnotiz am Objekt.typeträgt die Farbe,<Text>den Notiztext. -
Notizverknüpfung (
relation="1") — eine Verknüpfung zu einem anderen Objekt.typeist0,idist0,mediumist0, und<Creator>,<Created>,<Modifier>,<Modified>sowie<Text>bleiben leer. Die Verknüpfung erscheint auf beiden beteiligten Objekten, unterschieden durchrelationdirection.
Attribut an <Remark> |
Typ | Beschreibung |
|---|---|---|
|
xs:long |
Notiz-ID. Bei einer Notizverknüpfung |
|
xs:short |
Farbe der Objektnotiz: |
|
xs:short |
|
|
xs:short |
Nur bei |
|
xs:long |
Nur bei |
|
xs:long |
Nur bei |
|
xs:long |
Medium-ID der Notizdatei; |
medium taugt nicht zum Unterscheiden von Objektnotiz und Notizverknüpfung, dafür ist
relation da. Der Wert ist die Medium-ID der Notizdatei und keine Konstante: bei
Ablage im Dateisystem die ID des Systemmediums NOTE
(auf dem gemessenen Server 5), bei Ablage in der Datenbank 0, weil es keine Notizdatei gibt.
In der Spalte remarks.medium steht im Datenbankfall NULL und nicht 0. Gemessen an
enaio®-Server 12.0.
|
Kindelemente, immer alle fünf und in dieser Reihenfolge:
| Element | Inhalt |
|---|---|
|
Anlegername, Benutzer-ID im Attribut |
|
Anlegedatum als formatierter Text, Unix-Zeitstempel im Attribut |
|
Letzter Bearbeiter, Benutzer-ID im Attribut |
|
Datum der letzten Bearbeitung, Unix-Zeitstempel im Attribut |
|
Notiztext. Gefüllt bei der Objektnotiz, leer bei der Notizverknüpfung. Das Attribut |
<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="">Erste Objektnotiz</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>
Das Beispiel stammt von einem Server mit Notizablage im Dateisystem: medium trägt die Medium-ID
und <Text id> ist leer. Bei Ablage in der Datenbank steht an der Objektnotiz medium="0" und
<Text id> die textid.
<TxtNoticeCount> in den <BaseParams> zählt ausschließlich die
Objektnotizen. Notizverknüpfungen gehen nicht in den Zähler ein — ein Objekt mit
TxtNoticeCount 0 kann sehr wohl <Remark>-Elemente tragen.
|
Angelegt werden Notizen über dms.XMLInsert und
dms.XMLUpdate mit <RemarkText> beziehungsweise <RemarkObject>
(DMSData).
3.5.9. <DocumentVariants> / <DocumentVariant>
Varianten sind rekursiv aufgebaut: jede Variante kann selbst wieder Untervarianten enthalten.
| Attribut | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
xs:long |
Ja |
Objekt-ID dieser Variante |
|
xs:long |
Ja |
Objekt-ID der übergeordneten Variante ( |
|
xs:string |
Ja |
Versionsbezeichnung. Die Wurzelvariante trägt |
|
xs:short |
Ja |
|
3.5.10. <FileProperties>
Eigenschaften der am Dokument hinterlegten Datei. Leeres Element, alle Angaben stehen in Attributen.
| Attribut | Typ | Beschreibung |
|---|---|---|
|
xs:string |
Dateierweiterung ohne Punkt (z. B. |
|
xs:string |
MIME-Typ der Datei |
|
xs:string |
Gruppe des Dateityps als Grossbuchstaben-Kürzel (enaio®-eigen, nicht der MIME-Haupttyp) — siehe gemessene Werte |
|
xs:long |
Anzahl der Dateien des Dokuments |
|
xs:long |
Dateigröße in Byte |
|
xs:long |
ID des Dateisymbols |
|
xs:long |
Seitenanzahl des Dokuments. Erscheint nur, wenn die Seitenzahl größer |
Die Attribute mimetypegroup, iconid und documentpagecount fehlen im ausgelieferten
Hersteller-Schema, werden vom Server aber gesendet. documentpagecount steht dabei nur an
Dokumenten mit einer Seitenzahl größer 0 — gemessen an einem zweiseitigen PDF; bei JPG, DOCX,
XLSX und TXT fehlt das Attribut vollständig. Die Seitenzahl steht parallel dazu immer als
<DocumentPageCount> in den <BaseParams>, dort auch mit 0.
|
Die Seitenzahl wird nachträglich von einem serverseitigen Schritt ermittelt.
Unmittelbar nach dem Import meldet auch ein mehrseitiges Dokument
<DocumentPageCount>0</DocumentPageCount> und lässt documentpagecount weg; gemessen stand der
richtige Wert nach rund zwei Minuten. Eine Seitenzahl von 0 direkt nach dem Import sagt daher
nichts über die Datei aus (siehe Zeitlicher Ablauf nach dem Import).
|
Gemessene Werte von mimetypegroup
Die Gruppe ist ein kurzes Kürzel je Anwendungsfamilie, nicht der Präfix des MIME-Typs. Gemessen an enaio®-Server 12.0.769.25242 mit je einem Dokument pro Format:
| Endung | mimetype |
mimetypegroup |
iconid |
|---|---|---|---|
|
|
|
1073743982 |
|
|
|
1073743984 |
|
|
|
1073743959 |
|
|
|
1073744006 |
|
|
|
1073743978 |
| Fünf Messpunkte sagen nichts darüber, ob die Menge der Kürzel abgeschlossen ist. Weitere Formate (msg, tif, zip, pptx) sind nicht gemessen. |
3.6. <TypelessObjects> / <TypelessObject>
Typlose Objekte sind Dokumente ohne zugewiesenen Objekttyp — z. B. Dokumente in der Benutzerablage
oder der Workflowablage. Sie werden von <Archive> getrennt direkt unter <DMSContent> aufgeführt.
Eine Antwort mit typlosen Objekten, etwa von
dms.GetUserTrayObjects, besteht nur aus diesem Block und
<Messages> — ohne <Archive> und ohne <Statistics>. Das Attribut format am
<DMSContent>-Wurzelelement steht dabei auf LOL.
<DMSContent format="LOL" version="12.0.769.25242" timestamp="2026-09-25T12:50:48"
user="ROOT" station="devel-uw-2026">
<TypelessObjects>
<TypelessObject id="147247" maintype="4" module="WINDOWS" user="ROOT"
timestamp="1790333447"/>
</TypelessObjects>
<Messages/>
</DMSContent>
| Attribut | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
xs:long |
Ja |
Objekt-ID |
|
xs:short |
Ja |
Dokumenthaupttyp. Werte und Bedeutung: Objekttyp-ID. |
|
Ja |
Dokumentmodul |
|
|
xs:string |
Ja |
Benutzername des Eigentümers |
|
xs:long |
— |
Seitenanzahl |
|
xs:long |
— |
Dateigröße in Bytes |
|
xs:long |
— |
MIME-Typ-ID |
|
xs:string |
Ja |
Zeitstempel des Objekts als Unix-Zeitstempel |
Das ausgelieferte Hersteller-Schema führt alle acht Attribute als Pflicht. Gemessen an
enaio®-Server 12.0.769.25242 sendet der Server nur id, maintype, module, user und
timestamp — pagecount, filesize und mimetypeid fehlen auch dann, wenn das Objekt eine Datei
trägt. Die zu dieser Dokumentation gepflegte Schema-Fassung führt die drei deshalb als optional.
|
3.7. <Messages> / <Message>
Fehlermeldungen des Servers. Das Element steht am Ende jeder Antwort, direkt unter <DMSContent>.
|
In allen bisher gemessenen Konstellationen ist Gemessen an enaio®-Server 12.0.769.25242 über 30 aufgenommene Antworten quer durch HOL, LOL,
Benutzerkorb, Die Fälle teilen sich sauber in zwei Gruppen: entweder bricht der Job mit einem Fehlercode ab, oder
er läuft durch und schweigt. Einen Mittelweg, der |
| Attribut | Typ | Pflicht | Beschreibung |
|---|---|---|---|
Textinhalt |
xs:string |
— |
Beschreibung des Fehlers |
|
xs:long |
Ja |
Interner Fehlercode |
|
xs:long |
Ja |
Quellcode (identifiziert die Server-Komponente) |
3.8. <Statistics>
Paginierungsinformationen — immer vorhanden, auch wenn keine Treffer vorliegen.
| Attribut | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
xs:long |
Ja |
Maximale Trefferzahl pro Seite (konfiguriert in der Anfrage) |
|
xs:long |
Ja |
Startposition (0-basiert) des ersten gelieferten Treffers |
|
xs:long |
Ja |
Gesamtanzahl der Treffer (über alle Seiten) |
Für seitenweises Blättern: Gesamtseitenzahl = ⌈total_hits / pagesize⌉. Die nächste Seite wird durch startpos += pagesize angefordert.
|
4. Aufzählungstypen
4.1. dataformat
| Wert | Bedeutung |
|---|---|
|
List of Lists — tabellarisches Format mit |
|
Hierarchical Object List — Objektformat mit |
|
Kombination aus LOL und HOL |
4.3. modultype
| Wert | Haupttyp | Beschreibung |
|---|---|---|
|
|
Graustufen-Dokument |
|
|
Schwarz/Weiß-Dokument |
|
|
Farb-Dokument |
|
|
Windows-Dokument (Office, PDF, …) |
|
|
Multimedia-Dokument |
|
|
E-Mail-Dokument |
|
|
XML-Dokument |
|
|
Container-Dokument |
|
— |
Mehrseitiges zusammengesetztes Dokument |
|
— |
Verweisdokument (Referenz auf Fremdsystem) |
|
— |
Unbekannter Dokumenttyp |
4.4. ArchiveStateType
Textinhalt von <ArchiveState>; das Attribut value trägt den
zugehörigen Bitwert, denselben wie das Systemfeld
OBJECT_FLAGS.
| Wert | value |
Bedeutung |
|---|---|---|
|
|
Dokument kann archiviert werden (freigegeben) |
|
|
Dokument kann nicht archiviert werden |
|
|
Dokument hat keine Seiten |
|
|
Dokument ist archiviert |
|
— |
Fehler bei einer oder mehreren Seiten |
|
— |
Verweisdokument — kein eigenes Archivat |
|
— |
Status unbekannt |
Die vier Bitwerte sind an enaio®-Server 12.0.769.25242 gemessen. Für PAGE_ERROR,
REFERENCE und UNKNOWN liegt keine Messung vor.
|
Ein Dokument gilt nur dann als archiviert, wenn <ArchiveState> den Wert ARCHIVED
trägt. <Archivist> und <ArchiveDate> sind auch an nicht
archivierten Dokumenten gefüllt — gemessen bei NOT_ARCHIVABLE und NO_PAGES mit dem anlegenden
Benutzer und dem Anlagedatum. Eine Prüfung auf „ist archiviert" über diese beiden Elemente ist
daher falsch.
|
Der Übergang nach ARCHIVED stammt nicht vom Import, sondern von einem eigenen
Archivierungslauf. Gemessen an fünf Dokumenten mit je zwei Seiten:
| Zeitpunkt nach dem Import | Seitenzahl | <ArchiveState> |
|---|---|---|
sofort |
|
|
nach 2 Minuten |
|
|
nach 5 und nach 10 Minuten |
|
|
Die Seitenzahl füllt ein serverseitiger Schritt innerhalb der ersten Minuten, der Archivierungslauf folgt getrennt davon. Wer unmittelbar nach dem Import liest, bekommt für beides einen Zwischenstand.
4.5. LockedType
Textinhalt von <Locked> und des Systemfelds
OBJECT_LOCKUSER.
| Wert | Bedeutung |
|---|---|
|
Dokument ist nicht ausgecheckt |
|
Dokument ist vom Benutzer der abfragenden Sitzung ausgecheckt |
|
Dokument ist von einem anderen Benutzer ausgecheckt |
|
Dokument ist extern gesperrt |
Das Attribut value ist keine Zustandskennziffer, sondern die ID des sperrenden
Benutzers (benutzer.id). 0 steht für nicht
gesperrt, 1 für eine externe Sperre, jeder andere Wert ist eine Benutzer-ID aus
mng.GetUserList. Aus value lässt sich der Textzustand daher nicht
ableiten.
|
SELF und OTHERS sind zudem nicht gespeichert, sondern werden gegen den Benutzer der
abfragenden Sitzung ausgewertet: dasselbe Dokument meldet für den sperrenden Benutzer SELF und
für jeden anderen OTHERS, während value in beiden Fällen dieselbe Benutzer-ID trägt. Eine
Auswertung, die auf den Sperrenden abzielt, muss value heranziehen, nicht den Text.
Vier Dokumente in einer Antwort, abgefragt aus der Sitzung von ROOT (Benutzer-ID 2):
| Textinhalt | value |
Wie erzeugt |
|---|---|---|
|
|
unverändert, und nach dms.UndoCheckOutDocument |
|
|
dms.CheckOutDocument mit |
|
|
|
|
|
Checkout durch einen zweiten Benutzer mit der ID |
Die 2 bei SELF ist also kein Zustandscode, sondern die ID von ROOT.
Dieselben vier Dokumente, dieselbe Anfrage, einmal als ROOT (ID 2) und einmal als ein zweiter
Benutzer (ID 79) über
$$$SwitchContextUserName$$$:
| Dokument | Sicht ROOT |
Sicht Benutzer 79 |
|---|---|---|
von |
|
|
von Benutzer |
|
|
extern gesperrt |
|
|
frei |
|
|
value bleibt in jeder Zeile gleich, nur die beiden benutzerbezogenen Texte wechseln. EXTERNAL
und UNLOCKED sind in beiden Sichten identisch, weil sie sich auf keinen Benutzer beziehen.
5. Vollständiges Beispiel (HOL, gemessene Antwort)
Ausschnitt einer HOL-Antwort von enaio®-Server 12.0.769.25242 auf ein Dokument mit allen
Feldtypen, einem Tabellenfeld, einer Variante und einer angehängten Datei. Abgefragt mit
baseparams="1" fileinfo="1" status="1" rights="1" variants="1" object_inserts="1" remarks="1".
Die Feldliste ist gekürzt, alles Übrige ist unverändert.
<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>
<!-- … weitere Index- und Systemfelder … -->
</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>
Beobachtungen, die sich an dieser Antwort ablesen lassen:
-
Die Reihenfolge innerhalb von
<Object>ist<Fields>,<TableFields>,<Rights>,<BaseParams>,<Remarks>,<DocumentVariants>,<FileProperties>— und, bei Ordnern und Registern, anschließend<ChildObjects>. -
Systemfelder tragen
system="1"und liefern den übersetzten Text als Inhalt, den Rohwert im Attributvalue(value="2"zuNOT_ARCHIVABLE). -
Leere Werte erscheinen als leeres Element, nicht als fehlendes Element (
<RetentionDate>). -
<Remarks>ist auch ohne hinterlegte Notiz vorhanden, sobaldremarks="1"gesetzt ist. -
<Statistics>steht je<ObjectType>, nicht je<Archive>. -
osguidist eine 32-stellige Hexadezimalfolge ohne Trennzeichen; bei Systemfeldern steht dort statt dessen eine kurze numerische ID (1116).
6. Abweichungen zwischen Schema und Serververhalten
An den folgenden Stellen beschreibt das vom Hersteller ausgelieferte DMSContent.xsd etwas anderes,
als der Server tatsächlich sendet. Gemessen an enaio®-Server 12.0.769.25242. Die zu dieser
Dokumentation gepflegte Schema-Fassung ist an allen genannten Stellen korrigiert
(siehe Korrigierte Schema-Dateien).
| Stelle | Ausgeliefertes Schema | Serververhalten (gemessen) |
|---|---|---|
|
Nur Textinhalt |
Trägt die vollständige |
|
|
Sendet dazwischen |
Dokumentteil der |
Pflicht, endet nach |
Nur bei Dokumenten vorhanden; zusätzlich |
|
Zusätzlich |
|
Nicht deklariert |
Wird bei |
|
|
|
|
|
Ohne Attribute deklariert |
Trägt |
Nur |
Trägt die vollständige |
|
|
Pflichtattribute |
Werden nicht gesendet, auch nicht bei einem Objekt mit Datei |