XML for Analysis (XMLA) 是一种基于简单对象访问协议 (SOAP) 的 XML 协议,它是专为对驻留在 Web 上的任何标准多维数据源的通用数据访问而设计的。XMLA的好处就在于其应用级别的传输协议是SOAP,这使XMLA的服务提供者具有了WebService提供者的角色,从而各种语言编写的客户端都可以轻松访问,而不会带来额外的麻烦。 关于XMLA的文档网上已经很多,尤其是Microsoft提供了多个角度的大量文档;但是,这些文档的组织相对松散,其中某些容易出问题的环节更是分散在网络各个角落,而本文档的目的就是将这些散乱的内容组织起来,并加以简单解释,便于使用,本文将不断根据情况更新(最近更新请通过http//www.获取)。
记得多年前我们提供基于J2EE体系的商业智能解决方案时,所有的OLAP Server提供的接口都是传统的开发接口,尽管在我们的J2EE服务中面向查询及分析定义了统一的元数据结构,但仍然要对每一个Olap Server开发JNI代码来完成传统语言接口向Java体系的转换。而且,每一个厂商的查询语言都不相同,Microsoft Analysis Service是OLEDB/ADOMD上的MDX语句,Essbase及Oracle Express是C实现的DLL上的自有的DML语言,而Mondrian等当时还没有出现。 如今,XMLA已经越来越受到厂商的支持,除了Microsoft SSAS,Essbase(7.0以上)、SAS、Mondrian等都提供了”XMLA+MDX”的接口,这为包含了OLAP客户端逻辑的解决方案开发降低了学习成本,增加了平台移植性。 本文将以SSAS为例,讲解XMLA的开发过程。这些内容虽然在手册中多有提及,但内容很零散,而且编排是手册的格式,篇幅长不易快速上手。因此提供一个简单的指引也许会有帮助。 撰写本文的另一个原因是不希望让一些零碎经验停留在自己的脑子里,让一些零散的资料冰封在自己的硬盘甚至光盘中(如网友老紫竹所言,http://blog.csdn.net/java2000_net/archive/2008/10/31/3192658.aspx)。因此,希望看到的朋友,如果对你没有价值,只能说声抱歉,因此博客毕竟是仅从自己的兴趣出发,而且自己工作层面和文章很不同。
一、XMLA 概念XML for Analysis (XMLA) 开放标准支持对驻留在万维网上的数据源的数据访问。Microsoft SQL Server Analysis Services 按 XMLA 1.1 规范实现了 XMLA。 XML for Analysis (XMLA) 是一种基于简单对象访问协议 (SOAP) 的 XML 协议,它是专为对驻留在 Web 上的任何标准多维数据源的通用数据访问而设计的。XMLA 还消除了部署用于公开组件对象模型 (COM) 或 Microsoft .NET Framework 接口的客户端组件的需要。如果与服务器之间的往返通信要占用大量时间和资源,并且对数据源的有状态连接会限制服务器上的用户连接数,则 XMLA 会针对 Internet 进行优化。 XMLA 是一种针对 Microsoft SQL Server Analysis Services 的本机协议,用于客户端应用程序与 Analysis Services 实例之间的所有交互。Analysis Services 完全支持 XML for Analysis 1.1,并且还提供了支持元数据管理、会话管理和锁定功能的扩展。与 Analysis Services 实例进行通信时,分析管理对象 (AMO) 和 ADOMD.NET 都使用 XMLA 协议。
![]() 注意: 1)上图是微软提供的,只是示意了微软自己的客户端开发组件对XMLA的使用。其他客户端(JAVA等)对XMLA的使用与之类似。 2) 我们只可以使用XMLA over HTTP,而效率更高的XML over TCP/IP则是微软的专利保护技术,只供它自己的Sql Server Manage Studio/Business Intelligence Development Studio.
![]() 处理 XMLA 通信
XMLA 开放标准介绍了以下两种常规访问方法:Discover 和 Execute。这些方法使用 XML 支持的松散耦合客户端和服务器体系结构处理有关 Analysis Services 实例的传入和传出信息。
尽管 XMLA 协议是针对 Web 应用程序进行优化的,但它还可用于面向 LAN 的应用程序。下列应用程序可从基于此 XML 的 API 中获益:
1.2 、XMLA 和统一维度模型XMLA 是采用统一维度模型 (UDM) 方法的商业智能应用程序所使用的协议。 1.3、小结本节内容主要来自Microsoft的联机文档,目的是在继续之前让不熟悉概念者有一个大致的了解。本文将不断根据情况更新(最近更新请通过http//www.获取)。
二、配置XMLA over HTTP访问SASS(OLAP)的文档合集
关于XMLA的配置,在网络上已经有大量的资料。本节将不同环境下的配置过程可参考的指引进行了分类整理,其中有些资料是遇到问题时才需要关注的。
1. SQL Server Analysis Services 2000 2. SQL Server Analysis Services 2005,2008 2.1 Windows 5 / IIS6: Windows XP/Windows Server 2003
2.2 Windows 6 / IIS7: Windows Server 2008/vista
3. XMLA Over TCP/IP
三、XMLA over TCP/IP访问Analysis Services 2005/2008 Olap的释疑
XML/A over TCP/IP作为SQl Server Analysis Service 2005/2008自身客户端(SQL Server Management Studio/Business Intelligence Development Studio)和服务器端通讯的基本协议,却无法直接在我们第三方开发中使用。 因为XML/A over TCP/IP是微软的保留曲目,是专利保护的技术,目前只供自己使用。本文作者对该协议进行了详细分析,感兴趣的可以看看。但实际研发中,相当长一段时间我们如果想采用XML/A都必须通过XML/A over HTTP,配合IIS扩展使用。 对技术细节感兴趣同仁,不防通过Google专利搜索工具(http://www.google.com/patents)获取关于XML/A over TCP/IP的专利全文学习. 四、XMLA请求的格式及实例示意
XMLA请求由多层封包组成,总体结构如下图所示,可对照MSDN了解详情(http://technet.microsoft.com/zh-cn/library/ms186656.aspx):
其中,HTML封包是SOAP所依赖的传输协议,与XMLA之间相隔了SOAP一层,因此HTML封包与XMLA没有任何逻辑关系(实事上如本系列第四篇所述,微软自用的传输协议是TCP/IP之,还进一步的对SOAP封包进行了压缩及加密)。 SOAP封包与XMLA相邻,并被XMLA用来寄存维护会话的SESSION标头命令(四个命令)。没有指定SESSION标头的每一个命令都是一个独立的短暂会话,对于客户端保持原子化的事务特性。 XMLA方法的组成及结构在XMLA介绍一节我们知道XMLA具有两种方法,分别是Discover、Execute。 其中,Discover方法用于从 SSAS服务器及指定多维数据库实例检索结构性的信息,包括获取服务器的多维数据库Cube列表、Catalog、DataSource、Dimensions、Levels等。DisCover方法的结构如下: <Discover>
</Discover> Execute方法则携带Command参数,从指定的多维数据集获取查询数据。最常用Command是执行MDX语句查询的Statement命令(<Statement>MDX Query Clause</Statement>): <Execute>
XMLA SOAP请求实例(已去掉HTTP封包)下表是一个完整的获取数据源列表的XMLA Discover请求,表的第一列各行分割了XMLA封包的各部分,第二列对应行说明了各部分的含义。 <?xml version=”1.0″ encoding=”UTF-8″?> soap表头 <Discover xmlns=”urn:schemas-microsoft-com:xml-analysis” XMLA方法 </SOAP-ENV:Body> soap 需要特别注意的是XMLA访问SSAS 2000/2005/2008时存在着细微差异,高版本的SSAS对SOAP封包的属性要求更加严格,而在低版本中却可以做适当忽略。因此,如果在低版本的SSAS下可以运行的XMLA程序在高版本下无法获取结果的话,应该仔细查阅文档并跟踪比较,看看是否由于这个原因导致。 关于返回结果 如果知道完成特定任务的请求序列,关于结果的描述信息可以通过查找MSDN或XMLA SPEC可以轻松的获取。 因此,本系列不打算对XMLA的返回结果进行描述。 五、Discover方法解析及示例XMLA的Discover方法的命令很多,每个命令所附带的属性及参数也很复杂,如果逐条去掌握的话比较费力,本文主要以构建任务一中的多维数据库结构(见图1)及任务二中的Cube结构(见图2)为例介绍常用的命令及属性。这两个处理流程已经包含了基本的处理过程,更复杂的要求可以根据需要对之调整即可。 在介绍过程中,仅给出XMLA封包中的命令部分,外围的SOAP及HTTP封包(参见上一节)基本相同(除非打算在SOAP封包中显式控制SESSION及事务处理)不再重复给出。 注1:由于没有特别指定SESSION及事务,因此,下面的示例每个步骤都是独立的,可以单独请求获取对应信息; 注2:本节Discover命令可通过Execute命令配合MDX语句实现类似效果。 注3:本文的所有命令都是在SSAS2008下调试通过,使用的是微软提供的SSAS2008示例数据库(版本:Refresh1)Adventure Works DW 2008(http://www./MSFTDBProdSamples/Release/ProjectReleases.aspx?ReleaseId=18407); 任务一:构建多维数据库结构图1:
步骤示例:Step1:获取服务器或 Web 服务上可用的 XML for Analysis (XMLA) 访问接口数据源的列表;DISCOVER_DATASOURCES 返回结果 <Discover xmlns=”urn:schemas-microsoft-com:xml-analysis” SOAP-ENV:encodingStyle=”http://schemas./soap/encoding/”> <RequestType>DISCOVER_DATASOURCES</RequestType> <Restrictions> <RestrictionList> </RestrictionList> </Restrictions> <Properties> <PropertyList> <Content>Data</Content> </PropertyList> </Properties> </Discover> 行集:包含了可用数据源DataSource的名称、属性、支持特性等。 Step2:返回指定数据源所对应的数据库中的目录(Catalog)列表;DBSCHEMA_CATALOGS 返回结果 <Discover xmlns=”urn:schemas-microsoft-com:xml-analysis” SOAP-ENV:encodingStyle=”http://schemas./soap/encoding/”> <RequestType>DBSCHEMA_CATALOGS</RequestType> <Restrictions> <RestrictionList> </RestrictionList> </Restrictions> <Properties> <PropertyList> <DataSourceInfo>http://www.JBean.cn</DataSourceInfo> <Content>Data</Content> </PropertyList> </Properties> </Discover> 行集:获取上一步返回的数据源JBean 中的目录(Catalog)的名称、描述、访问控制列表ACL等信息。 Step3:返回指定数据源、Catalog下多维数据集(CUBE)列表;MDSCHEMA_CUBES 返回结果 <Discover xmlns=”urn:schemas-microsoft-com:xml-analysis” SOAP-ENV:encodingStyle=”http://schemas./soap/encoding/”> <RequestType>MDSCHEMA_CUBES</RequestType> <Restrictions> <RestrictionList> </RestrictionList> </Restrictions> <Properties> <PropertyList> <DataSourceInfo>http://www.JBean.cn</DataSourceInfo> <Catalog>Adventure Works DW 2008</Catalog> <Format>Tabular</Format> <Content>SchemaData</Content> </PropertyList> </Properties> </Discover> 行集:返回指定数据源(JBean)、Catalog(Adventure Works DW 2008)下的CUBE列表; 任务二:构建多维数据库结构接下来介绍的是获取一个CUBE(这里是任务一最后一步获取的Adventure Works多维数据集)的维度、层次及成员结构所需的基本步骤。 如下图2所示,我们将展开‘Adventure Works’Cube的维度,并展开其Sale Channel维度的层级直到该维的成员一级。
步骤示例:Step1:获取指定CUBE的维度(Dimension)列表;MDSCHEMA_DIMENSIONS 返回结果 <Discover xmlns=”urn:schemas-microsoft-com:xml-analysis” SOAP-ENV:encodingStyle=”http://schemas./soap/encoding/”> <RequestType>MDSCHEMA_DIMENSIONS</RequestType> <Restrictions> <RestrictionList> <CATALOG_NAME>Adventure Works DW 2008</CATALOG_NAME> <CUBE_NAME>Adventure Works</CUBE_NAME> </RestrictionList> </Restrictions> <Properties> <PropertyList> <DataSourceInfo>http://www.JBean.cn</DataSourceInfo> <Catalog>Adventure Works DW 2008</Catalog> <Format>Tabular</Format> <Content>SchemaData</Content> </PropertyList> </Properties> </Discover> 行集:返回指定数据源(JBean)及Catalog(Adventure Works DW 2008)下的CUBE(Adventure Works)的所有维度列表; Step2:获取指定维度(Dimension)的默认层次(Level)列表;MDSCHEMA_DIMENSIONS 返回结果 <Discover xmlns=”urn:schemas-microsoft-com:xml-analysis” SOAP-ENV:encodingStyle=”http://schemas./soap/encoding/”> <RequestType>MDSCHEMA_LEVELS</RequestType> <Restrictions> <RestrictionList> <CATALOG_NAME>Adventure Works DW 2008</CATALOG_NAME> <CUBE_NAME>Adventure Works</CUBE_NAME> <DIMENSION_UNIQUE_NAME>[Sales Channel]</DIMENSION_UNIQUE_NAME> </RestrictionList> </Restrictions> <Properties> <PropertyList> <DataSourceInfo>http://www.JBean.cn</DataSourceInfo> <Catalog>Adventure Works DW 2008</Catalog> <Format>Tabular</Format> <Content>SchemaData</Content> </PropertyList> </Properties> </Discover> 行集:返回指定数据源(JBean)、Catalog(Adventure Works DW 2008)、CUBE(Adventure Works)下的维度(Sales Channel)的所有层次列表; Step3:获取指定层次(Level)下的成员(Member)列表;MDSCHEMA_MEMBERS 返回结果 <Discover xmlns=”urn:schemas-microsoft-com:xml-analysis” SOAP-ENV:encodingStyle=”http://schemas./soap/encoding/”> <RequestType>MDSCHEMA_MEMBERS</RequestType> <Restrictions> <RestrictionList> <CATALOG_NAME>Adventure Works DW 2008</CATALOG_NAME> <CUBE_NAME>Adventure Works</CUBE_NAME> <LEVEL_UNIQUE_NAME>[Sales Channel].[Sales Channel].[(All)]</LEVEL_UNIQUE_NAME> </RestrictionList> </Restrictions> <Properties> <PropertyList> <DataSourceInfo>http://www.JBean.cn</DataSourceInfo> <Catalog>Adventure Works DW 2008</Catalog> <Format>Tabular</Format> <Content>SchemaData</Content> </PropertyList> </Properties> </Discover> 行集:返回维度sale Channel的指定层次(All)下的成员列表;
六、XMLA Execute方法解析及实例XMLA的Execute方法比较简单那,主要是执行 Command 元素中提供的 XMLA 命令(MDX Statement),并使用 XMLA Rowset 数据类型(行集:用于表格式结果的表达)或 XMLA MDDataSet 数据类型(多维数据集:用于多维结果的表达)返回任何结果数据。 EXECUTE方法示例:EXECUTE COMMAND之Statement 返回结果 <Execute xmlns=”urn:schemas-microsoft-com:xml-analysis” SOAP-ENV:encodingStyle=”http://schemas./soap/encoding/”> <Command> <Statement> SELECT NON EMPTY {{{[Measures].[Internet Sales Amount]}}} ON COLUMNS, NON EMPTY{{[Delivery Date].[Calendar].[Month].Members}} ON ROWS FROM [Adventure Works] </</Statement> </</Command> <Properties> <PropertyList> <DataSourceInfo>http://www.JBean.cn</DataSourceInfo> <Catalog>Adventure Works DW 2008</Catalog> <Format>Multidimensional</Format> <Content>Data</Content> <AxisFormat>TupleFormat</AxisFormat> </PropertyList> </Properties> </</Execute> 在指定的数据源(JBean)及Catalog(Adventure Works DW 2008)下执行MDX语句并返回: 行集或多维数据集,MDX查询结果;
总结至此,本系列关于XMLA的介绍已经全部结束。本文将不断根据情况更新(最近更新请通过http//www.获取)。正如前文所说,本系列的目的主要是帮助不熟悉的同仁沿着各章节逐步将XMLA应用起来,而直至本系列结束为止,才真正到了根据你的业务需求进行实际开发的起点。 在开发过程中如果需要进一步的了解,可以访问以下资源: 1)XMLA1.1规范:http://www./ 2)Microsoft XMLA 参考:http://technet.microsoft.com/zh-cn/library/ms186604.aspx 3)Analysis Services 数据访问接口:http://technet.microsoft.com/zh-cn/library/ms126037.aspx 4)多维表达式 (MDX) 参考:http://technet.microsoft.com/zh-cn/library/ms145506.aspx 5)Rex (waRehouse EXplorer)-An opensource java client for XMLA 6)SAP BI XMLA and XMLA Connector:http://help./saphelp_nw04/Helpdata/EN/ba/e380e03c3a4dbf8cf082f0c910f9cf/frameset.htm 7)Oracle Essbase-XMLA Provider for Hyperion Essbase:http://www.oracle.com/technology/products/bi/essbase/provider-services.html |
|