包含项目模式和项目关系信息的 GDB_Items 和 GDB_ItemRelationships 地理数据库系统表中存在着若干个 XML 列。特别是 GDB_Items 表中的 Definition 列,该列提供了有关地理数据库的详细信息。该列包含的 XML 文档的类型取决于特定项目类型。例如,要素类的定义包含有关表的字段、应用的域和子类型、几何的空间参考以及要素类是否参与控制器数据集的信息。
要使用 IBM Db2、Microsoft SQL Server 或 PostgreSQL 系统表中 XML 列的值,请从数据库中完整地检索 XML 文档,并在本地 XML 或文本查看器中使用该文档。使用 Java、C++ 或 C# 等语言的开发者可能更喜欢在文档对象模型 (DOM) 中读取文档。SQL 开发者可以使用数据库 XML 功能通过 XPath(XML 文档的一种查询语言)从项目定义中检索特定的值。
在 Oracle 和 IBM Informix 中的地理数据库内,XML 列使用 ArcSDE XML,从而在一系列独立的表中以 BLOB 的形式存储信息。因此,不能直接通过 SQL 访问它们。
为了能够查看 Oracle 地理数据库内系统表中的 XML 列的内容,存在两个系统视图,这两个视图使用 CLOB 数据类型存储地理数据库系统表 XML 列中的内容。GDB_Items_vw 在各个 CLOB 列中显示 GDB_Items 表的 Definition、Documentation 和 ItemInfo 这三个列的内容。GDB_ItemRelationships_vw 在 CLOB 中显示了 GDB_ItemRelationships 表的 Attributes 列的内容。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 模式》,特别是以使用系统表的开发者为目标读者的附录。
可以像查询 GDB_Items 表中的 Definition 列那样查询系统表中的其他 XML 列,但是需要了解的是:Documentation 列没有任何地理数据库定义的 XML 模式。Documentation 列中存储着与地理数据库项目有关的元数据。但是,Documentation 列中所包含的确切的元数据元素组会因组织的不同而有所不同(具体取决于组织所采用的元数据标准以及组织在管理信息时所遵循的工作流程)。用于描述 ArcGIS 元数据结构的 XML DTD (ArcGISmetadatav1.dtd) 是随 ArcGIS Desktop 一起提供的,位于 ArcGIS 安装目录的 \Metadata\Translator\Rules 子文件夹中。
从 XML 列中提取多个值
在许多情况下,从单个的 XML 文档中提取多个值是很有意义的。以下是 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 表达式的代码和值对。以下示例显示了如何从单个的 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