Il existe plusieurs colonnes XML dans les tables système de géodatabase GDB_Items et GDB_ItemRelationships qui contiennent les informations sur la structure et les relations des éléments. Une colonne en particulier, la colonne Definition de la table GDB_Items, fournit des informations détaillées sur une géodatabase. Le type de document XML contenu dans la colonne dépend du type d’élément spécifique. Par exemple, la définition d’une classe d’entités contient des informations sur les champs d’une table, les domaines et les sous-types appliqués, la référence spatiale de la géométrie et indique si la classe d’entités fait partie d’un jeu de données de contrôleur.
Pour utiliser une valeur d’une colonne XML dans une table système dans IBM Db2, Microsoft SQL Server ou PostgreSQL, procédez à l’extraction du document XML à partir de la base de données totale et utilisez-la en local dans une visionneuse XML ou texte. Les développeurs utilisant des langages tels que Java, C++, ou C# préféreront peut-être lire le document dans un DOM. Les développeurs SQL peuvent utiliser les fonctions XML de base de données pour extraire des valeurs spécifiques depuis les définitions d’élément à l’aide de Xpath (langage de requête pour les documents XML).
Dans les géodatabases Oracle et IBM Informix, les colonnes XML utilisent XML ArcSDE, qui stocke les informations sous forme d'objets BLOB dans une série de tables distinctes. Ainsi, elles ne sont pas directement accessibles avec SQL.
Pour vous permettre d'afficher le contenu des colonnes XML dans les tables système des Oracle, deux vues système stockent le contenu des colonnes XML des tables système de la géodatabase dans un type de données CLOB. GDB_Items_vw affiche le contenu des colonnes Definition, Documentation et ItemInfo et de la table GDB_Items dans les colonnes CLOB. GDB_ItemRelationships_vw affiche le contenu de la colonne Attributes de la table GDB_ItemRelationships dans une colonne CLOB. Les colonnes CLOB peuvent être lues comme du texte.
L’exemple suivant illustre la définition d’élément d’une définition de domaine par plage dans un document XML :
<? 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>
Les deux valeurs les plus importantes d’un domaine par plage sont les valeurs minimum et maximum. Les expressions XPath qui représentent ces éléments sont /GPRangeDomain2/MinValue et /GPRangeDomain2/MaxValue, respectivement. Cette requête SQL indique comment extraire ces valeurs pour un domaine par plage spécifique dans une géodatabase dans SQL Server :
--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
L’exemple précédent est relativement simple. Pour des solutions plus complexes, consultez le livre blanc XML Schema of the Geodatabase, et notamment l’annexe destinée aux développeurs qui utilisent des tables système.
Vous pouvez interroger les autres colonnes XML des tables système de la même façon que la colonne Definition de la table GDB_Items, mais notez bien qu’aucune structure XML n’est définie par la géodatabase pour la colonne Documentation. La colonne Documentation stocke les métadonnées associées aux éléments de géodatabase. Toutefois, l’ensemble exact d’éléments de métadonnées qu’elle contient varie d’une organisation à l’autre, en fonction de la norme de métadonnées et du processus de gestion des informations qu’elles adoptent. Un DTD XML décrivant la structure de métadonnées ArcGIS (ArcGISmetadatav1.dtd) est fourni avec ArcGIS Desktop dans le sous-dossier \Metadata\Translator\Rules du répertoire d'installation d'ArcGIS.
Extraire plusieurs valeurs depuis une colonne XML
Il est souvent utile d’extraire plusieurs valeurs d’un document XML unique. Voici la valeur Definition dans un tel scénario, un domaine de valeurs codées :
<? 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>
Les valeurs qui sont habituellement les plus intéressantes pour les développeurs et les administrateurs sont les paires de valeurs et de codes, qui présentent une expression XPath de type /GPCodedValueDomain2/CodedValues/CodedValue. L’exemple suivant indique comment extraire plusieurs valeurs à partir d’une seule définition XML pour obtenir les paires de valeurs et de codes de tous les domaines d’une géodatabase dans SQL Server :
-- 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