Existen varias columnas XML en las tablas del sistema de geodatabase GDB_Items y GDB_ItemRelationships que contienen información sobre el esquema de elementos y las relaciones de elementos. Especialmente la columna Definición de la tabla GDB_Items ofrece información detallada sobre una geodatabase. El tipo de documento XML que contiene la columna depende del tipo de elemento concreto. Por ejemplo, la definición de una clase de entidad contiene información sobre los campos de la tabla, los dominios y subtipos aplicados, la referencia espacial de la geometría y si la clase de entidad participa en un dataset de controlador.
Para trabajar con un valor de una columna XML en una tabla de sistema en IBM Db2, Microsoft SQL Server o PostgreSQL, recupere el documento XML completo de la base de datos y trabaje con él a nivel local en un visor de XML o de texto. Es posible que los desarrolladores que utilizan lenguajes como Java, C++ o C# prefieran leer el documento en un Modelo de objetos del documento (DOM). Los desarrolladores SQL pueden usar las funciones XML de la base de datos para recuperar valores específicos de definiciones de elementos mediante XPath (un lenguaje de consulta para documentos XML).
En geodatabases de Oracle y IBM Informix, las columnas XML usan XML de ArcSDE XML, que almacena información como BLOB en una serie de tablas separadas. Por ello, no se puede acceder a estas directamente con SQL.
Para poder ver el contenido de las columnas XML en las tablas del sistema en geodatabases de Oracle, existen dos vistas del sistema que almacenan el contenido a partir de las columnas XML de la tabla del sistema de geodatabase en un tipo de datos CLOB. GDB_Items_vw muestra el contenido de las columnas Definition, Documentation e ItemInfo de los CLOB de la tabla GDB_Items. GDB_ItemRelationships_vw muestra el contenido de la columna Attributes de la tabla GDB_ItemRelationships en un CLOB. Los CLOB se pueden leer como texto.
El siguiente ejemplo muestra la definición de elemento de la definición de un dominio de rango en un documento 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>
Los dos valores más importantes para un dominio de rango son los valores mínimo y máximo. Las expresiones XPath que representan estos elementos son /GPRangeDomain2/MinValue y /GPRangeDomain2/MaxValue, respectivamente. Esta consulta SQL muestra cómo extraer estos valores para un dominio de rango específico en una geodatabase de 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
El siguiente ejemplo es relativamente simple. Para las soluciones más complejas, consulte el documento Esquema XML de la geodatabase, especialmente el apéndice orientado a los desarrolladores que trabajan con las tablas del sistema.
Es posible consultar el resto de columnas XML en las tablas del sistema del mismo modo que la columna Definición de la tabla GDB_Items, pero tenga en cuenta que no hay un esquema XML definido por la geodatabase para la columna Documentación. La columna Documentación almacena los metadatos asociados con los elementos de la geodatabase. No obstante, el conjunto exacto de elementos de metadatos que contiene varía entre las organizaciones según el estándar de metadatos que sigan y su flujo de trabajo para administrar la información. Se incluye un DTD XML que describe la estructura de los metadatos de ArcGIS, ArcGISmetadatav1.dtd, con ArcGIS Desktop en la subcarpeta \Metadata\Translator\Rules del directorio de instalación de ArcGIS.
Extraer varios valores de una columna XML
Hay muchos casos en los que resulta útil extraer varios valores de un único documento XML. Como ejemplo, el siguiente es el valor Definition, un dominio de valor codificado.
<? 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>
Los valores que suelen ser de mayor interés para desarrolladores y administradores son los pares de código y valor, que tienen una expresión XPath de /GPCodedValueDomain2/CodedValues/CodedValue. El siguiente ejemplo muestra cómo extraer varios valores de una única definición XML para obtener los pares de código y valor para todos los dominios en una geodatabase de 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