XML 列の検索

GDB_Items テーブルと GDB_ItemRelationships テーブルには、アイテムのスキーマとアイテムの関係に関する情報を持つ複数の XML 列があります。特に、GDB_Items テーブルの [Definition] という列は、ジオデータベースの詳細情報を得るために不可欠です。[Definition] 列の XML ドキュメントのタイプは、その特定のアイテム タイプによって異なります。たとえば、フィーチャクラスの定義には、テーブルのフィールド、使用されるドメイン、サブタイプ、空間参照、コントローラ データセットの登録などに関する情報が含まれます。

XML 列の値を操作する最も簡単な方法は、データベースからドキュメント全体を取得し、それをローカルで処理することです。この方法の単純な例として、XML ドキュメントをファイルとして保存し、それを XML またはテキスト ビューアで表示する方法があります。Java、C++、C# などの言語を使用している開発者は、ドキュメントを DOM(Document Object Model)に読み込むこともできます。SQL 開発者の場合は、データベース XML 関数を使用して、XPath(XML ドキュメント用のクエリ言語)でアイテム定義から特定の値を取得できます。

メモメモ:

XML 関数のシグネチャと振舞いは、データベース管理システムによって大きく異なります。

アイテム定義の単純な例としては、範囲ドメインの定義が挙げられます。次の 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 クエリは、特定の範囲ドメインにおけるこれらの値の抽出方法を示しています。

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

上記のような単純な例だと、返される情報の XPaths を検索することが簡単ですが、これより複雑な情報の取得方法については、XPath の定義に関する「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

Oracle で使用されるシステム テーブルとビューについては、「ジオデータベース システム テーブルの概要」のセクション「ジオデータベース システム テーブルの XML」をご参照ください。


3/6/2012