我试图使用XML92生成器将4个SAS表(都具有唯一列)导出为一个XML。棘手的部分是其中一个表应该充当XML文件中的更高层。
作为测试的示例:
首先创建一些表
DATA TMP.RootTable;
ATTRIB RTabCol1 Format = $20.;
ATTRIB RTabCol2 Format = $20.;
INPUT RTabCol1 RTabCol2;
DATALINES;
RTabCol1Val1 RTabCol2Val1
;
DATA TMP.Table1;
ATTRIB Tab1Col1 Format = $20.;
ATTRIB Tab1Col2 Format = $20.;
INPUT Tab1Col1 Tab1Col2;
DATALINES;
Tab1Col1Val1 Tab1Col2Val1
Tab1Col1Val2 Tab1Col2Val2
;
DATA TMP.Table2;
ATTRIB Tab2Col1 Format = $20.;
ATTRIB Tab2Col2 Format = $20.;
INPUT Tab2Col1 Tab2Col2;
DATALINES;
Tab2Col1Val1 Tab2Col2Val1
Tab2Col1Val2 Tab2Col2Val2
Tab2Col1Val3 Tab2Col2Val3
;
DATA TMP.Table3;
ATTRIB Tab3Col1 Format = $20.;
ATTRIB Tab3Col2 Format = $20.;
ATTRIB Tab3Col3 Format = $20.;
INPUT Tab3Col1 Tab3Col2 Tab3Col3;
DATALINES;
Tab3Col1Val1 Tab3Col2Val1 Tab3Col3Val1
Tab3Col1Val2 Tab3Col2Val2 Tab3Col3Val2
;
我正在使用XML生成器
libname XMLOUT XML92 XMLTYPE=xmlmap XMLMAP=MyMAP;
与此地图:
<?xml version="1.0"?>
<SXLEMAP name="xmlmap" version="1.9">
<OUTPUT>
<TABLEREF name="XMLTEST" />
</OUTPUT>
<TABLE name="XMLTEST">
<TABLE-PATH syntax="XPath">
/RootTable
</TABLE-PATH>
<COLUMN name="RTabCol1">
<PATH>/RTabCol1</PATH>
<DESCRIPTION>RTabCol1</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="RTabCol2">
<PATH>/RTabCol2</PATH>
<DESCRIPTION>RTabCol2</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="Tab1Col1">
<PATH>/Table1/Tab1Col1</PATH>
<DESCRIPTION>Tab1Col1</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="Tab1Col2">
<PATH>/Table1/Tab1Col2</PATH>
<DESCRIPTION>Tab1Col2</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="Tab2Col1">
<PATH>/Table2/Tab2Col1</PATH>
<DESCRIPTION>Tab2Col1</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="Tab2Col2">
<PATH>/Table2/Tab2Col2</PATH>
<DESCRIPTION>Tab2Col2</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="Tab3Col1">
<PATH>/Table3/Tab3Col1</PATH>
<DESCRIPTION>Tab3Col1</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="Tab3Col2">
<PATH>/Table3/Tab3Col2</PATH>
<DESCRIPTION>Tab3Col2</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
<COLUMN name="Tab3Col3">
<PATH>/Table3/Tab3Col3</PATH>
<DESCRIPTION>Tab3Col3</DESCRIPTION>
<TYPE>character</TYPE>
<DATATYPE>string</DATATYPE>
<LENGTH>20</LENGTH>
</COLUMN>
</TABLE>
</SXLEMAP>
最后把所有的东西放在一起:
DATA XMLOUT.FXMLTEST;
SET TMP.RootTable;
SET TMP.Table1;
SET TMP.Table2;
SET TMP.Table3;
RUN;
现在SAS代码工作到目前为止,这就是我的结果看起来像(我跳过了头):
<RootTable>
<RTabCol1>RTabCol1Val1</RTabCol1>
<RTabCol2>RTabCol2Val1</RTabCol2>
<Table1>
<Tab1Col1>Tab1Col1Val1</Tab1Col1>
<Tab1Col2>Tab1Col2Val1</Tab1Col2>
</Table1>
<Table2>
<Tab2Col1>Tab2Col1Val1</Tab2Col1>
<Tab2Col2>Tab2Col2Val1</Tab2Col2>
</Table2>
<Table3>
<Tab3Col1>Tab3Col1Val1</Tab3Col1>
<Tab3Col2>Tab3Col2Val1</Tab3Col2>
<Tab3Col3>Tab3Col3Val1</Tab3Col3>
</Table3>
</RootTable>
现在的问题是,在XML中只写入第一个数据线。然而,我在RootTable中只有一个数据线,而在其他表中有多个数据线,它们属于RootTable中的一个数据线。我试着把数据从RootTable复制到多行,但是元素被关闭并重新打开。所以我想要的结果是这样的:
<RootTable>
<RTabCol1>RTabCol1Val1</RTabCol1>
<RTabCol2>RTabCol2Val1</RTabCol2>
<Table1>
<Tab1Col1>Tab1Col1Val1</Tab1Col1>
<Tab1Col2>Tab1Col2Val1</Tab1Col2>
</Table1>
<Table2>
<Tab2Col1>Tab2Col1Val1</Tab2Col1>
<Tab2Col2>Tab2Col2Val1</Tab2Col2>
</Table2>
<Table3>
<Tab3Col1>Tab3Col1Val1</Tab3Col1>
<Tab3Col2>Tab3Col2Val1</Tab3Col2>
<Tab3Col3>Tab3Col3Val1</Tab3Col3>
</Table3>
<Table1>
<Tab1Col1>Tab1Col1Val2</Tab1Col1>
<Tab1Col2>Tab1Col2Val2</Tab1Col2>
</Table1>
<Table2>
<Tab2Col1>Tab2Col1Val2</Tab2Col1>
<Tab2Col2>Tab2Col2Val2</Tab2Col2>
</Table2>
<Table3>
<Tab3Col1>Tab3Col1Val2</Tab3Col1>
<Tab3Col2>Tab3Col2Val2</Tab3Col2>
<Tab3Col3>Tab3Col3Val2</Tab3Col3>
</Table3>
<Table2>
<Tab2Col1>Tab2Col1Val3</Tab2Col1>
<Tab2Col2>Tab2Col2Val3</Tab2Col2>
</Table2>
</RootTable>
我不知道我的错误是否在XMLMAP中,或者是否有一种方法可以将一个选项交给XML生成器以将RootTable标记为XML- root。任何帮助都是非常感谢的,请考虑到我是新来的SAS。所以我可能犯了一些新手犯的错误。
编辑:当更改为:
DATA XMLOUT.FXMLTEST;
if _n_ eq 1 then SET TMP.RootTable;
SET TMP.Table1;
SET TMP.Table2;
SET TMP.Table3;
RUN;
输出变为:
<RootTable>
<RTabCol1>RTabCol1Val1</RTabCol1>
<RTabCol2>RTabCol2Val1</RTabCol2>
<Table1>
<Tab1Col1>Tab1Col1Val1</Tab1Col1>
<Tab1Col2>Tab1Col2Val1</Tab1Col2>
</Table1>
<Table2>
<Tab2Col1>Tab2Col1Val1</Tab2Col1>
<Tab2Col2>Tab2Col2Val1</Tab2Col2>
</Table2>
<Table3>
<Tab3Col1>Tab3Col1Val1</Tab3Col1>
<Tab3Col2>Tab3Col2Val1</Tab3Col2>
<Tab3Col3>Tab3Col3Val1</Tab3Col3>
</Table3>
</RootTable>
<RootTable>
<RTabCol1>RTabCol1Val1</RTabCol1>
<RTabCol2>RTabCol2Val1</RTabCol2>
<Table1>
<Tab1Col1>Tab1Col1Val2</Tab1Col1>
<Tab1Col2>Tab1Col2Val2</Tab1Col2>
</Table1>
<Table2>
<Tab2Col1>Tab2Col1Val2</Tab2Col1>
<Tab2Col2>Tab2Col2Val2</Tab2Col2>
</Table2>
<Table3>
<Tab3Col1>Tab3Col1Val2</Tab3Col1>
<Tab3Col2>Tab3Col2Val2</Tab3Col2>
<Tab3Col3>Tab3Col3Val2</Tab3Col3>
</Table3>
</RootTable>
所以是的,现在我有更多的值从其他表,但我的问题是,<RootTable>
打开和关闭再次。然而,我需要其他值在<RootTable></RootTable>
的第一个(也是唯一的)括号中。
如果问题是它只从每一行读取一行,那么原因很简单,与XML无关…
DATA XMLOUT.FXMLTEST;
SET TMP.RootTable;
SET TMP.Table1;
SET TMP.Table2;
SET TMP.Table3;
RUN;
读取,直到一个表的行用完。这发生在第二行!
试试这个:
DATA XMLOUT.FXMLTEST;
if _n_ eq 1 then SET TMP.RootTable;
SET TMP.Table1;
SET TMP.Table2;
SET TMP.Table3;
RUN;
我不确定这是否会解决你的问题-我无法直接使用你的地图,它导致了一些xml解析错误我没有时间修复-但这就是为什么你只有一行从后面的表。