使用SAS XML92生成器导出多表为单根节点多层XML的问题
解决方案
1. 修正XMLMAP配置
你之前的配置将所有字段归属到同一个表结构下,会导致每行输出对应生成一个根节点。修改为多表映射结构,明确标注子节点为可重复属性:
<?xml version="1.0"?> <SXLEMAP name="xmlmap" version="1.9"> <OUTPUT> <!-- 按输出顺序声明表:先根表,再子表 --> <TABLEREF name="RootTable" /> <TABLEREF name="Table1" /> <TABLEREF name="Table2" /> <TABLEREF name="Table3" /> </OUTPUT> <!-- 根表定义:仅出现1次,对应顶层RootTable节点 --> <TABLE name="RootTable"> <TABLE-PATH syntax="XPath">/RootTable</TABLE-PATH> <COLUMN name="RTabCol1"> <PATH>/RootTable/RTabCol1</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> <COLUMN name="RTabCol2"> <PATH>/RootTable/RTabCol2</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> </TABLE> <!-- Table1定义:可重复子节点,归属RootTable下 --> <TABLE name="Table1"> <TABLE-PATH syntax="XPath" REPEAT="YES">/RootTable/Table1</TABLE-PATH> <COLUMN name="Tab1Col1"> <PATH>/RootTable/Table1/Tab1Col1</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> <COLUMN name="Tab1Col2"> <PATH>/RootTable/Table1/Tab1Col2</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> </TABLE> <!-- Table2定义:可重复子节点,归属RootTable下 --> <TABLE name="Table2"> <TABLE-PATH syntax="XPath" REPEAT="YES">/RootTable/Table2</TABLE-PATH> <COLUMN name="Tab2Col1"> <PATH>/RootTable/Table2/Tab2Col1</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> <COLUMN name="Tab2Col2"> <PATH>/RootTable/Table2/Tab2Col2</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> </TABLE> <!-- Table3定义:可重复子节点,归属RootTable下 --> <TABLE name="Table3"> <TABLE-PATH syntax="XPath" REPEAT="YES">/RootTable/Table3</TABLE-PATH> <COLUMN name="Tab3Col1"> <PATH>/RootTable/Table3/Tab3Col1</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> <COLUMN name="Tab3Col2"> <PATH>/RootTable/Table3/Tab3Col2</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> <COLUMN name="Tab3Col3"> <PATH>/RootTable/Table3/Tab3Col3</PATH> <TYPE>character</TYPE> <DATATYPE>string</DATATYPE> <LENGTH>20</LENGTH> </COLUMN> </TABLE> </SXLEMAP>
2. 替换导出代码
不需要横向拼接多表,按XMLMAP声明的顺序依次写入对应表即可:
/* 定义XML输出库,替换为你自己的文件路径 */ libname XMLOUT XML92 "C:\你的输出路径\result.xml" XMLTYPE=xmlmap XMLMAP="C:\你的MAP路径\mymap.map" ; /* 写入根表,仅1行,生成唯一顶层RootTable节点 */ data XMLOUT.RootTable; set TMP.RootTable; run; /* 写入Table1所有行,生成重复的Table1子节点 */ data XMLOUT.Table1; set TMP.Table1; run; /* 写入Table2所有行,生成重复的Table2子节点 */ data XMLOUT.Table2; set TMP.Table2; run; /* 写入Table3所有行,生成重复的Table3子节点 */ data XMLOUT.Table3; set TMP.Table3; run; /* 关闭库完成写入 */ libname XMLOUT clear;
3. 输出效果
最终生成的XML仅包含1个RootTable根节点,所有子表数据嵌套在根节点内:
<?xml version="1.0" encoding="UTF-8" ?> <RootTable> <RTabCol1>RTabCol1Val1</RTabCol1> <RTabCol2>RTabCol2Val1</RTabCol2> <Table1> <Tab1Col1>Tab1Col1Val1</Tab1Col1> <Tab1Col2>Tab1Col2Val1</Tab1Col2> </Table1> <Table1> <Tab1Col1>Tab1Col1Val2</Tab1Col1> <Tab1Col2>Tab1Col2Val2</Tab1Col2> </Table1> <Table2> <Tab2Col1>Tab2Col1Val1</Tab2Col1> <Tab2Col2>Tab2Col2Val1</Tab2Col2> </Table2> <!-- 剩余Table2、Table3节点依次生成 --> </RootTable>
原问题原因
之前的写法将4张表横向拼接为1张宽表,XML92默认会为宽表的每一行生成一个对应根节点,所以出现重复根节点的问题。拆分多表写入+XMLMAP标注重复节点的方式可以精准控制层级结构。
内容的提问来源于stack exchange,提问作者Nils
相关产品推荐
相关产品推荐

