XML 列查询
包含项目模式和项目关系信息的 GDB_Items 和 GDB_ItemRelationships 表中存在着若干个 XML 列。特别是 GDB_Items 表中的“定义”列,它是获取地理数据库详细信息必不可少的列。“定义”列所包含的 XML 文档的类型取决于特定的项目类型,例如,要素类的定义包含关于表字段、所使用的域、子类型、空间参考和控制器数据集参与以及其他内容的信息。
使用 XML 列中的值的最简单的方式是从数据库中全文检索文档并在本地使用文档。一个简单的示例是将 XML 文档保存为文件,然后在 XML 或文本查看器中查看 XML 文档。使用 Java、C++ 或 C# 等语言的开发者可能更喜欢在文档对象模型 (DOM) 中读取文档。对于 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
对于上述的简单示例,找到要返回的信息的 XPath 是一件很容易的事。但是,如果是更复杂的解决方案,则需要参阅白皮书《地理数据库的 XML 模式》来了解 XPath 定义,特别需要参阅以使用系统表的开发者为目标读者的附录。
可以像查询 GDB_Items 表中的“定义”列那样查询系统表中的其他 XML 列,但是需要了解的是:“文档”列没有任何地理数据库定义的 XML 模式。“文档”列中存储着与地理数据库项目有关的元数据。但是,“文档”列中所包含的确切的元数据元素组会因组织的不同而有所不同(具体取决于组织所采用的元数据标准以及组织在管理信息时所遵循的工作流程)。用于描述 ArcGIS 元数据结构的 XML DTD (ArcGISmetadatav1.dtd) 是随 ArcGIS Desktop 一起提供的,它位于 ArcGIS 安装目录的 \Metadata\Translator\Rules 子文件夹中。
从 XML 列中提取多个值
在许多情况下,从单个的 XML 文档中提取多个值是很有意义的。以下是“定义”值的一个示例(一个已编码的值域):
<? 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
有关 Oracle 使用的系统表和视图的详细信息,请参阅地理数据库 (geodatabase) 系统表快速浏览的“地理数据库系统表中的 XML”部分。