发明内容
针对现有技术中所存在的问题,本发明的目的是提供一种将数据流中的数据输出到XML文件中的适配器及方法,该适配器及方法能够使用户将Microsoft SQL Server 2005集成数据流任务中的数据灵活方便地输出到XML文件中。
为达到以上目的,本发明采取的技术方案是:
一种用于将Microsoft SQL Server 2005集成服务数据流管道中的数据按照要求的文件格式输出到XML文件中的适配器,包括以下模块:
XML文件读取模块,用于读取XML模板文件的内容,并将其存储到内存的XML模板文件中;所述的XML文件读取模块还包括一个输入连接管理器,用于验证模板文件是否存在以及是否为XML格式,并负责连接通过验证的XML模板文件数据源;
数据管理模块,用于读取数据流管道中的数据,将这些数据以行对象的方式存储到行对象集中;
数据组织模块,用于对行对象集进行处理;
XML目标输出模块,用于将XML模板对象的说明部分内容和数据组织模块处理后的数据输出到目标XML文件中;所述的XML目标输出模块还包括一个输出连接管理器,用于验证目标文件是否存在以及是否为XML格式,并负责连接通过验证的目标XML文件。
一种用于将Microsoft SQL Server 2005集成服务数据流管道中的数据按照要求的文件格式输出到XML文件中的方法,包括以下步骤:
(1)XML文件读取模块通过输入连接管理器连接到XML模板数据源,读取XML模板文件的内容,并将其存储到内存的XML模板对象中;所述的输入连接管理器用于验证模板文件是否存在以及是否为XML格式,并负责连接通过验证的XML模板文件数据源;
(2)数据管理模块读取数据流管道中的数据,将这些数据按照行存储到行对象集中;
(3)数据组织模块对行对象集进行处理;
(4)XML目标输出模块通过输出连接管理器连接目标XML文件,然后将XML模版对象的说明部分内容和数据组织模块的处理结果写入到目标XML文件中;所述的输出连接管理器用于验证目标文件是否存在以及是否为XML格式,并负责连接通过验证的目标XML文件。
进一步,步骤(1)中所述的XML模版文件是一个外部的可随需求自行定义的说明性文件,用来说明目标XML文件需要的格式。
进一步,所述的目标XML文件需要的格式包括目标XML文件所使用的XSLT文件名称,各个元素的层次关系,各个元素的名称,属性,及其与管道数据中各个字段的对应关系。
进一步,步骤(1)中所述的模版对象主要包括节点标签、节点属性集、节点的子节点集、节点的类型、节点的叶子节点。
进一步,步骤(2)中所述的管道中的数据是源适配器中流出的数据,或者是经过转换组件转换过的数据。
进一步,步骤(2)中所述的行对象是一个字段对象的集合。
进一步,所述的字段对象包括字段的名称和字段的值。
进一步,步骤(3)中数据组织模块对行对象集进行处理的过程如下:数据组织模块循环读取行对象集中的字段名称及其字段值,按照XML模版文件中对象的格式存放到行节点对象中,并从行对象集中删除当前行对象,直至处理完成。
本发明的效果在于:采用本发明所述的适配器及方法,用户可以方便地配置和操作该适配器,具有灵活性和非耦合性;此外,用户还可以通过拖拽的方式,把该适配器放在数据流任务中,并按照XML模版中规定的样式把数据流管道中的数据生成到XML文件中。
具体实施方式
下面结合实施例和附图对本发明作进一步的描述。
如图1所示,一种将数据流中的数据输出到XML文件中的适配器1,该适配器1包括以下模块:
XML文件读取模块2,包括一个输入连接管理器21,用于验证模板文件是否存在以及是否为XML格式,并连接通过验证的XML模版文件6数据源及读取XML模板文件6的内容,并将其存储到内存的XML模板对象中;
数据管理模块3,用于读取数据流管道中的数据,将这些数据以行对象的方式存储到行对象集中;
数据组织模块4,用于按照所述的XML模板文件6的说明格式组织所述的数据流管道中的数据;
XML目标输出模块5,包括一个输出连接管理器51,用于验证目标文件是否存在以及是否为XML格式,并连接通过验证的目标XML文件7,将XML模板对象的说明部分内容和数据组织模块组织后的数据输出到目标XML文件7中。
如图2所示,一种将数据流中的数据输出到XML文件中的方法,包括以下步骤:
(1)XML文件读取模块2通过输入连接管理器21连接到XML模板文件6数据源,读取XML模板文件6的内容,并将其存储到内存的模板对象中(S1);所述的XML模版文件6是一个外部的可随需求自行定义的说明性文件,用来说明目标XML文件需要的格式,包括目标XML文件所使用的XSLT文件名称,各元素的层次关系、名称、属性及其与数据流管道数据中各个字段的对应关系等;所述的模版对象包括节点标签、节点属性值、节点的子节点集、节点的类型、节点的叶子节点等。
(2)数据管理模块3读取数据流管道中流入的数据,将这些数据按照行存储到行对象集中,每一行对应一个行对象集(S2);所述的数据流管道中流入的数据可以是源适配器中流出的数据,也可以是经过转换组件转换过的数据;所述的行对象是一个字段对象的集合,字段对象又包括字段的名称及其字段的值。
(3)数据组织模块4对行对象集进行处理;首先循环读取行对象集中的字段名称及其字段值,按照模版对象的格式存放到行节点对象中,并从行对象集中删除当前行对象,直至处理完成(S3)。
(4)XML目标输出模块5通过输出连接管理器51连接目标XML文件7,然后将XML模版对象的说明部分的内容和行节点对象集写入到目标XML文件中7(S4)。
下面以图书搜索为例对本发明作进一步描述,要求把搜索关键词及其搜索到的前三本图书数据按照要求格式输出到XML文件中。此过程具有两个明显的阶段:设计阶段和运行阶段。当具体实现时将继承基类Microsoft.SqlServer.Dts.Pipeline.PipelineComponent的内容。
在设计阶段:采用的方法主要是重载的ProvideComponentProperties方法和Validate方法,具体完成以下工作:
(1)将输出到XML文件中数据的格式要求预先写入到XML模板文件6中;
本实施例中XML模版文件6的内容如下:
<?xml version=″1.0″encoding=″utf-8″?>
<XmlSchama>
<xlstName>test.xls</xlstName>0
<nodes>
<!--生成的Xml文件的根节点-->
<node type=″root″>
<nodeTag>BookTop</nodeTag>
<attributes>
<!--节点的属性-->
<attribute>
<!--属性的名称-->
<name>type</name>
<!--属性的值,对应数据流中的一列-->
<value>topType</value>
</attribute>
</attributes>
</node>
<!--对应数据流中的一行-->
<node type=″row″>
<nodeTag>keyWord</nodeTag>
<attributes>
<attribute>
<name>name</name>
<value>HotKeyWord</value>
</attribute>
<attribute>
<name>count</name>
<value>count</value>
</attribute>
</attributes>
<!--这个节点中的子节点的名称-->
<sonNodes>
<sonNode>Book</sonNode>
</sonNodes>
<!--行的标示,表示这个节点是否结束-->
<rowKey>HotKeyWord</rowKey>
</node>
<!--节点的子节点-->
<node type=″sonNode″>
<nodetag>Book</nodetag>
<!--节点中包括的叶子节点-->
<leafNodes>
<leafNode>
<Tag>BookId</Tag>
<value>BookId</value>
</leafNode>
<leafNode>
<Tag>BookName</Tag>
<value>BookName</value>
</leafNode>
<leafNode>
<Tag>Author</Tag>
<value>Author</value>
</leafNode>
<leafNode>
<Tag>BookImg</Tag>
<value>BookImg</value>
</leafNode>
</leafNodes>
</node>
</nodes>
</Xml Schama>
(2)XML文件读取模块2中的输入连接管理器21验证模板文件是否存在以及是否为XML格式,并负责连接通过验证的XML模板文件6;
(3)XML文件输出模块5中的输出连接管理器51验证目标文件是否存在以及是否为XML格式,并负责连接通过验证的目标XML文件7。。
在运行阶段:采用的方法主要是重载的PreExecute方法和processInput方法,具体完成以下工作:
(1)通过XML文件读取模块2的输入连接管理器21连接到存储有要求格式的XML模版文件6数据源,XML文件读取模块2读取XML模版文件6的内容,并将其存放到模版对象中(S1);
连接管理器连接XML模版文件6和目标XML文件7,其中重载的方法有AcquireConnections和ReleaseConnections两个方法。
(2)数据管理模块3读取管道中搜索图书的关键词和搜索到的前三本图书的数据,并将这些数据按照行存放到行对象集中,每一行对应一个行对象集(S2)。行对象是一个字段对象的集合,字段对象又包括字段的名称和字段的值;
本实施例中数据流管道中的数据,具体说明如下表所示:
字段名称 |
字段类型 |
说明 |
topType |
Int |
排行榜类型 |
HotKeyWord |
Nvarchar(50) |
检索词 |
count |
int |
检索次数 |
BookID |
Varchar(96) |
图书ID |
BookName |
Varchar(96) |
图书名称 |
Author |
Varchar(96) |
图书作者 |
BookImg |
Varchar(96) |
图片位置 |
(3)数据组织模块4循环读取行对象集中的数据,按照XML模版文件预先写入的格式要求把每一行的数据存放到行节点对象中(S3)。
(4)最后通过XML目标输出模块5中的输出连接管理器51连接到目标XML文件7,XML目标输出模块5把模版对象的说明部分的内容和行节点对象集写入到目标XML文件7中(S4)。
本实施例中输出的目标xml文件7举例如下:
<?xml version=″1.0″encoding=″utf-8″?>
<?xml-style sheet type=″text/xsl″href=″test.xls″?>
<BookTop type=″12″>
<KeyWord name=″中国″count=″200″>
<Book>
<BookID>m20070702DXGDST01446</BookID>
<BookName>中国思想史(三)</BookName>
<Author>读书堂著</Author>
<BookImg>Image2006\443\M20070702DXGDST01446.JPG</BookImg>
</Book>
<Book>
<BookID>m20070702DXGDST01447</BookID>
<BookName>中国思想史(四)</BookName>
<Author>读书堂著</Author>
<BookImg>Image2006\443\M20070702DXGDST01447.JPG</BookImg>
</Book>
<Book>
<BookID>m20070702DXGDST01450</BookID>
<BookName>中国文学史(上)</BookName>
<Author>读书堂著</Author>
<BookImg>Image2006\443\M20070702DXGDST01450.JPG</BookImg>
</Book>
</KeyWord>
<KeyWord name=″天气″count=″100″>
<Book>
<BookID>m20070713DXGWYSS00007</BookID>
<BookName>气象万千</BookName>
<Author>北京五洋盛世图书有限公司著</Author>
<BookImg>Image2006\445\M20070713DXGWYSS00007.jpg</BookImg>
</Book>
<Book>
<BookID>m20070525DXGDST02268</BookID>
<BookName>天气与气候</BookName>
<Author>读书堂著</Author>
<BookImg>Image2006\444\M20070525DXGDST02268.jpg</BookImg>
</Book>
<Book>
<BookID>m20070828DXGDST3544</BookID>
<BookName>中华学生百科全书--天气与气候</BookName>
<Author>读书堂著</Author>
<BookImg>Image2006\1\M20070828DXGDST3544.jpg</BookImg>
</Book>
</KeyWord>
</BookTop>
本发明所述的适配器及方法并不限于具体实施方式中所述的实施例,本领域技术人员根据本发明的技术方案得出其他的实施方式,例如将连接管理器不设置在XML文件读取模块和XML目标输出模块中,而是单独设置,同样属于本发明的技术创新范围。