GDB_Items テーブルと GDB_ItemRelationships ジオデータベース システム テーブルには、アイテムのスキーマとアイテムの関係に関する情報を持つ複数の XML 列があります。特に、GDB_Items テーブルの [Definition] という列は、ジオデータベースの詳細情報を提供します。この列が格納する XML ドキュメントのタイプは、特定のアイテム タイプによって決まります。たとえば、フィーチャクラスの定義には、テーブルのフィールド、適用されるドメインとサブタイプ、ジオメトリの空間参照、およびフィーチャクラスがコントローラー データセットに属しているかどうかに関する情報が含まれます。
IBM Db2、Microsoft SQL Server、または PostgreSQL のシステム テーブル内の XML 列の値を操作するには、データベースから XML ドキュメント全体を取得し、XML ビューアーまたはテキスト ビューアーでローカルに操作します。Java、C++、C# などの言語を使用している開発者は、ドキュメントを DOM (Document Object Model) に読み込むこともできます。SQL 開発者は、データベース XML 関数を使用して、XPath (XML ドキュメント用のクエリ言語) でアイテム定義から特定の値を取得できます。
Oracle と Informix のジオデータベースの場合、XML 列では ArcSDE XML が使用され、一連の別テーブルに BLOB として情報が格納されます。そのため、SQL で XML 列に直接アクセスすることはできません。
Oracle のジオデータベースでシステム テーブルの XML 列の内容を表示できるように、ジオデータベース システム テーブルの XML 列の内容を CLOB データ タイプで格納するシステム ビューが 2 つ用意されています。GDB_Items_vw は、GDB_Items テーブルの Definition、Documentation、ItemInfo の各列の内容を CLOB 列に格納します。GDB_ItemRelationships_vw は、GDB_Relationships テーブルの Attributes 列の内容を CLOB 列に格納します。CLOB 列の内容はテキストとして読み取ることができます。
以下の例は、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>
範囲ドメインの最も重要な値は、最小値と最大値です。これらのエレメントを表す XPath 式は、それぞれ /GPRangeDomain2/MinValue と /GPRangeDomain2/MaxValue です。次の SQL クエリは、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
前の例は、比較的シンプルです。これより複雑な情報の取得方法については、「XML Schema of the Geodatabase」というホワイト ペーパー (特に、システム テーブルを操作する開発者を対象とした付録) をご参照ください。
システム テーブルの他の XML 列も、GDB_Items テーブルの [Definition] 列と同じ方法で検索できます。ただし、[Documentation] 列には、ジオデータベースによって定義された XML スキーマはないので注意してください。[Documentation] 列には、ジオデータベース アイテムに関連付けられたメタデータが格納されます。ただし、含まれるメタデータ エレメント群は、組織のメタデータ標準と情報管理のワークフローに基づくため、各組織によって異なります。ArcGIS メタデータの構造を記述している XML DTD (ArcGISmetadatav1.dtd) は、ArcGIS Desktop に付属しており、ArcGIS のインストール ディレクトリの \Metadata\Translator\Rules サブフォルダーにあります。
XML 列からの複数の値の抽出
1 つの XML ドキュメントから複数の値を抽出するケースがあります。以下に、そのような例の 1 つであるコード値ドメインの Definition 値を示します。
<? 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>
開発者と管理者が最も興味を持つ値は通常、コードと値の組み合わせです。これは、/GPCodedValueDomain2/CodedValues/CodedValue という XPath 式を持ちます。次の例は、1 つの XML 定義から複数の値を抽出し、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