Requêtes de colonne XML

Il existe plusieurs colonnes XML dans les tables GDB_Items et GDB_ItemRelationships, qui contiennent les informations sur la structure et les relations des éléments. Une colonne en particulier, la colonne Définition dans la table GDB_Items, est indispensable pour obtenir des informations détaillées sur une géodatabase. Le type de document XML qu'elle contient 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 de la table, les domaines utilisés, les codes, la référence spatiale, et la participation du jeu de données du contrôleur, entre autres choses.

La méthode la plus simple pour utiliser une valeur de colonne XML est de récupérer le document entier dans la base de données et de l'utiliser localement. Vous pouvez par exemple, enregistrer le document XML en tant que fichier et l'afficher dans une visionneuse de texte ou XML. Les développeurs utilisant des langages tels que Java, C++, ou C# préféreront peut-être lire le document dans un DOM. Pour les développeurs SQL, les fonctions XML de base de données peuvent permettre d'extraire des valeurs spécifiques dans les définitions d'élément à l'aide de Xpath (langage de requête pour les documents XML).

RemarqueRemarque :

Les signatures et le comportement des fonctions XML varient sensiblement entre systèmes de gestion de bases de données.

La définition d'un domaine par plage constitue un exemple simple de définition d'élément. Le document XML suivant constitue une définition de domaine par plage standard :

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

En général, les deux valeurs les plus importantes pour 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 :

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

Dans un exemple simple comme le précédent, il est facile de trouver les XPath des informations que vous souhaitez extraire. Toutefois, pour des solutions plus complexes, consultez le document de synthèse XML Schema of the Geodatabase, section définitions XPath, particulièrement l'annexe destinée aux développeurs travaillant sur des tables système.

Les autres colonnes XML des tables système peuvent être interrogées de la même façon que la colonne Définition 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 workflow de gestion des informations qu'elles adoptent. Un fichier 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.

Extraction de plusieurs valeurs dans une colonne XML

Il est souvent utile d'extraire plusieurs valeurs d'un document XML unique. Voici la valeur Définition dans un tel scénario, un domaine de valeurs pré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 d'une définition XML unique pour obtenir les paires de valeurs et de codes pour 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

Pour en savoir plus sur les tables système et les vues utilisées dans Oracle, consultez la section "XML dans les tables système de la géodatabase" de la rubrique Présentation rapide des tables système de la géodatabase.


3/6/2012