You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 12:24:02