In den Geodatabase-Systemtabellen "GDB_Items" und "GDB_ItemRelationships" sind mehrere XML-Spalten vorhanden, die Informationen zum Elementschema und zu Elementbeziehungen enthalten. Insbesondere die Spalte "Definition" in der Tabelle "GDB_Items" liefert detaillierte Informationen zu einer Geodatabase. Der Typ des in der Spalte angegebenen XML-Dokuments ist abhängig vom jeweiligen Feldtyp. Zum Beispiel enthält die Definition einer Feature-Class Informationen über die Felder, Domänen und Subtypes der Tabelle und über den Raumbezug der Geometrie, und sie gibt an, ob die Feature-Class Bestandteil eines Controller-Datasets ist.
Wenn Sie einen Wert aus einer XML-Spalte einer Systemtabelle in IBM Db2, Microsoft SQL Server oder PostgreSQL verwenden möchten, rufen Sie das gesamte XML-Dokument aus der Datenbank ab, und bearbeiten Sie es lokal in einem XML- oder Text-Editor. Entwickler mit Sprachen wie z. B. Java, C++ oder C# ziehen es möglicherweise vor, das Dokument in ein Dokumentobjektmodell (DOM) einzulesen. SQL-Entwickler können Datenbank-XML-Funktionen verwenden, um bestimmte Werte mit XPath (einer Abfragesprache für XML-Dokumente) aus Felddefinitionen abzurufen.
In Geodatabases in Oracle und Informix verwenden die XML-Spalten ArcSDE-XML, das Informationen als BLOBs in einer Reihe von separaten Tabellen speichert. Auf diese kann direkt mit SQL zugegriffen werden.
Damit Sie die Inhalte der XML-Spalten in den Systemtabellen in Geodatabases in Oracle anzeigen können, gibt es zwei Systemsichten, in denen die Inhalte aus den XML-Spalten der Geodatabase-Systemtabelle in einem CLOB-Datentyp gespeichert werden. "GDB_Items_vw" zeigt den Inhalt der Spalten "Definition", "Dokumentation" und "ItemInfo" in der Tabelle "GDB_Items" in CLOB-Spalten an. In "GDB_ItemRelationships_vw" wird der Inhalt der Spalte "Attribute" der Tabelle "GDB_ItemRelationships" in einer CLOB-Spalte angezeigt. Der Inhalt der CLOB-Spalten kann als Text gelesen werden.
Das folgende Beispiel zeigt die Felddefinition einer Bereichsdomänendefinition in einem XML-Dokument:
<? xml version = "1.0" encoding="utf-8"?>
<GPRangeDomain2
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:typens = "http://www.esri.com/schemas/ArcGIS/10.0"
xsi:type = "typens:GPRangeDomain2">
<DomainName>Angle</DomainName>
<FieldType>esriFieldTypeInteger</FieldType>
<MergePolicy>esriMPTDefaultValue</MergePolicy>
<SplitPolicy>esriSPTDuplicate</SplitPolicy>
<Description>Valid rotation angles</Description>
<Owner>harley</Owner>
<MaxValue xsi:type = "xs:int">359</MaxValue>
<MinValue xsi:type = "xs:int">0</MinValue>
</GPRangeDomain2>
Die zwei wichtigsten Werte für eine Bereichsdomäne sind die Minimal- und Maximalwerte. Die XPath-Ausdrücke, die diese Elemente darstellen, sind /GPRangeDomain2/MinValue und /GPRangeDomain2/MaxValue. Diese SQL-Abfrage zeigt, wie diese Werte für eine bestimmte Bereichsdomäne in einer Geodatabase in SQL Server extrahiert werden:
--Queries an sde-schema geodatabase in SQL Server
SELECT
Definition.value('(/GPRangeDomain2/MinValue)[1]','nvarchar(max)') AS "MinValue",
Definition.value('(/GPRangeDomain2/MaxValue)[1]','nvarchar(max)') AS "MaxValue"
FROM
sde.GDB_ITEMS INNER JOIN sde.GDB_ITEMTYPES
ON sde.GDB_ITEMS.Type = sde.GDB_ITEMTYPES.UUID
WHERE
sde.GDB_ITEMS.Name = 'Angle' AND
sde.GDB_ITEMTYPES.Name = 'Range Domain'
MinValue MaxValue
0 359
Das genannte Beispiel ist relativ einfach. Verwenden Sie für komplexere Lösungen das Whitepaper XML Schema of the Geodatabase als Grundlage – insbesondere den Anhang, der sich an Entwickler richtet, die mit Systemtabellen arbeiten.
Die anderen XML-Spalten in den Systemtabellen können auf die gleiche Weise wie die Spalte "Definition" der Tabelle "GDB_Items" abgefragt werden; beachten Sie aber, dass es kein durch die Geodatabase definiertes XML-Schema für die Spalte "Documentation" gibt. Die Spalte "Documentation" speichert die mit Geodatabase-Elementen verknüpften Metadaten. Welche Metadatenelemente genau enthalten sind, ist jedoch je nach verwendetem Metadatenstandard und Workflow zum Verwalten der Informationen der Organisationen unterschiedlich. Eine XML-DTD, die die Struktur der ArcGIS-Metadaten beschreibt (ArcGISmetadatav1.dtd), wird in ArcGIS Desktop im Unterordner \Metadata\Translator\Rules des ArcGIS-Installationsverzeichnisses bereitgestellt.
Extrahieren von mehreren Werten aus einer XML-Spalte
Es gibt viele Fälle, für die es sinnvoll ist, mehrere Werte aus einem einzelnen XML-Dokument zu extrahieren. Unten sehen Sie den Wert Definition für ein solches Beispiel, eine Domäne mit codierten Werten:
<? xml version = "1.0" encoding="utf-8"?>
<GPCodedValueDomain2
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs = "http://www.w3.org/2001/XMLSchema"
xmlns:typens = "http://www.esri.com/schemas/ArcGIS/10.0"
<DomainName>Material</DomainName>
<FieldType>esriFieldTypeString</FieldType>
<MergePolicy>esriMPTDefaultValue</MergePolicy>
<SplitPolicy>esriSPTDuplicate</SplitPolicy>
<Description>Valid pipe materials</Description>
<Owner>aelflad</Owner>
<CodedValues xsi:type= "typens:ArrayOfCodedValue">
<CodedValue xsi:type= "typens:CodedValue">
<Name>Cast iron</Name>
<Code xsi:type= "xs:string">CI</Code>
</CodedValue>
<CodedValue xsi:type= "typens:CodedValue">
<Name>Ductile iron</Name>
<Code xsi:type= "xs:string">DI</Code>
</CodedValue>
<CodedValue xsi:type= "typens:CodedValue">
<Name>PVC</Name>
<Code xsi:type= "xs:string">PVC</Code>
</CodedValue>
<CodedValue xsi:type= "typens:CodedValue">
<Name>Asbestos concrete</Name>
<Code xsi:type= "xs:string">AC</Code>
</CodedValue>
<CodedValue xsi:type= "typens:CodedValue">
<Name>Copper</Name>
<Code xsi:type= "xs:string">COP</Code>
</CodedValue>
</CodedValues>
</GPCodedValueDomain2>
Die Werte, die normalerweise am interessantesten für Entwickler und Administratoren sind, sind die Code- und Wertpaare, die den XPath-Ausdruck /GPCodedValueDomain2/CodedValues/CodedValue aufweisen. Im folgenden Beispiel wird gezeigt, wie mehrere Werte aus einer einzelnen XML-Definition extrahiert werden, um die Code- und Wertpaare für alle Domänen in einer Geodatabase in SQL Server abzurufen:
-- Get the code/value pairs for each coded value domain in the geodatabase.
SELECT
codedValue.value('Code[1]', 'nvarchar(max)') AS "Code",
codedValue.value('Name[1]', 'nvarchar(max)') AS "Value"
FROM
dbo.GDB_ITEMS AS items INNER JOIN dbo.GDB_ITEMTYPES AS itemtypes
ON items.Type = itemtypes.UUID
CROSS APPLY
items.Definition.nodes
('/GPCodedValueDomain2/CodedValues/CodedValue') AS CodedValues(codedValue)
WHERE
itemtypes.Name = 'Coded Value Domain' AND
items.Name = 'Material'
Code Value
CI Cast iron
DI Ductile iron
PVC PVC
AC Asbestos concrete
COP Copper