XML-Spaltenabfragen

In den Tabellen "GDB_Items" und "GDB_ItemRelationships" sind mehrere XML-Spalten vorhanden, die Informationen zum Elementschema und zu Elementbeziehungen enthalten. Insbesondere eine Spalte, die Spalte "Definition" in der Tabelle "GDB_Items", ist zum Abrufen von detaillierten Informationen zu einer Geodatabase unentbehrlich. Der enthaltene XML-Dokumenttyp hängt vom jeweiligen Elementtyp ab; die Definition einer Feature-Class enthält z. B. Informationen zu den Feldern der Tabelle, den verwendeten Domänen, Subtypes, dem Raumbezug, der Controller-Dataset-Beteiligung usw.

Die einfachste Möglichkeit, mit einem Wert in einer XML-Spalte zu arbeiten, ist, das komplette Dokument aus der Datenbank abzurufen und lokal damit zu arbeiten. Ein einfaches Beispiel dafür ist, das XML-Dokument als Datei zu speichern und in einem XML- oder Text-Viewer anzuzeigen. Entwickler mit Sprachen wie z. B. Java, C++ oder C# ziehen es möglicherweise vor, das Dokument in ein Dokumentobjektmodell (DOM) einzulesen. Für SQL-Entwickler können Datenbank-XML-Funktionen verwendet werden, um bestimmte Werte mit XPath (eine Abfragesprache für XML-Dokumente) aus Felddefinitionen abzurufen.

HinweisHinweis:

Die Signaturen und das Verhalten von XML-Funktionen sind je nach Datenbankmanagementsystem sehr unterschiedlich.

Ein einfaches Beispiel für eine Felddefinition ist eine Bereichsdomäne. Das unten dargestellte XML-Dokument ist eine typische Bereichsdomänendefinition:

 <? 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>

Im Allgemeinen sind die zwei wichtigsten Werte für eine Bereichsdomäne 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 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

Bei einem einfachen Beispiel wie dem vorherigen ist es einfach, den XPath der Informationen zu suchen, die Sie zurückgeben möchten. Für komplexere Lösungen sollten Sie jedoch die XPath-Definitionen im Whitepaper-XML-Schema der Geodatabase als Grundlage verwenden – insbesondere den Anhang, der für Entwickler geschrieben wurde, 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, aber beachten Sie, dass es kein Geodatabase-definiertes XML-Schema für die Spalte "Documentation" gibt. Die Spalte "Documentation" speichert die mit Geodatabase-Elementen verknüpften Metadaten. Der genaue Satz von Metadatenelementen, den sie enthält, ist jedoch je nach verwendetem Metadatenstandard und Workflow zum Verwalten der Informationen zwischen 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 Definitionswert 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

Informationen zu den in Oracle verwendeten Systemtabellen und Sichten finden Sie im Abschnitt "XML in Geodatabase-Systemtabellen" in Kurzer Überblick über Geodatabase-Systemtabellen.


3/6/2012