在SAS9.1.3版本中,开始支持XML操作,通过其强大的XML引擎技术,已经把XML完美的体现在SAS里面
具体体现如下:
从SAS数据集导出一个XML文档,这个XML文档可以被其它产品使用,也可以被用于不同主机间的数据传输
导入XML文档,这个XML文档可以转换为SAS数据集
在XML引擎使用上也非常简单,同其它引擎使用一样,首先要通过LIBNAME分配一个采用XML引擎的库,如下面例子,简单的把一个SAS数据集导出为一个XML文件
libname myfiles 'C:\My Files\';
libname myxml xml 'C:\My Files\XML\Singers.xml';
data myxml.Singers;
set myfiles.Singers;
run;
输出的XML文件内容如下:
引擎常见问题:
1、SAS XML引擎是采用DOM还是采用SAX方式处理?
答:XML会根据不同的情况使用不同的方式,如下:
如果格式化输出类型为GENERIC(缺省)或者ORACLE,那么XML引擎将采用DOM模型
如果你使用XMLMAP以导入一个XML文件,那么XML引擎将采用SAX模型
2、XML引擎会验证XML文档么?
答:不会,XML引擎会假设XML文档内容是全部正确的,引擎不使用DTD或者 SCHEMA
3、XML引擎和ODS MARKUP输出有什么不同?
答:ODS MARKUP可以输出XML文档,但不能读XML文档
4、为什么我导入XML文档时发生错误
答:XML引擎读文件依赖于其相应的选项XMLTYPE=。如果XML文件不符合SAS格式,将会报错,你可以通过XMLMAP来规范化你的XML文件
一个例外是HTML文件格式,XML引擎只支持导出,而不支持导入
5、我可以使用SAS数据选项作用于XML引擎上么?
答:可以,但需要小心使用
6、为什么导出的XML文件中含有空格
答:因为XML引擎是和W3C标准保持一致,所有会在元素的前、后加入空格,如果你想去除空格也可以,只需使用指定的 Tagset ,如下:
libname testxml xml 'C:\My Documents\XML\nospace.xml' tagset=tagsets.sasxmnsp;
proc copy in=sashelp out=testxml;
select class;
run;
这样产生的XML中就不会含有空格,如下
可以自定义自己的输出/输入格式么?
答:可以,通过使用Tagset,如XML引擎在默认输出时元素名采用字段名,如果你想自定义输出为标签名,可以如下使用:
/*产生数据集*/
data Singers;
input Name $ Style $;
label Name=“SingerFirstName”
Style=“MusicStyle”;
datalines;
Tom Rock
Kris Country
Willie Country
Barbra Contemporary
Paul Rock
Randy Country
;
run;
/*定义TAGSET*/
proc template;
define tagset Tagsets.Uselabs;
parent = tagsets.sasxmog;
notes “Uses label instead of name for tags”;
define event SASColumn;
start:
ndent;
put
'<' ;
put
TEXT
/ if cmp(XMLDATAFORM, “ATTRIBUTE”);
put
' name=“'
/ if cmp(XMLDATAFORM, ”ATTRIBUTE”);
put
LABEL;
put
'”'
/ if cmp(XMLDATAFORM, “ATTRIBUTE”);
break;
finish:
xdent
/ if exists(MISSING);
break
/ if exists(MISSING);
put
' />'
/ if cmp(XMLDATAFORM, “ATTRIBUTE”);
put
CR
/ if cmp(XMLDATAFORM, “ATTRIBUTE”);
xdent
/ if cmp(XMLDATAFORM, “ATTRIBUTE”);
break
/ if cmp(XMLDATAFORM, “ATTRIBUTE”);
put
'</' ;
put
LABEL;
put
'>' ;
put
CR;
xdent;
break;
end;
end; /* uselabs */
run;
/*输出XML文件*/
libname testxml xml 'C:\My Documents\XML\labels.xml' tagset=tagsets.uselabs;
proc copy in=work out=testxml;
select Singers;
run;