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

如何从SAS生成符合指定结构的正确XML(避免重复数据)

解决SAS导出XML时重复公司节点的问题

要实现一个公司节点下包含多个交易的嵌套XML结构,核心是先将扁平化的SAS数据集拆分为主表(公司信息)和子表(交易信息),再通过XML映射文件定义两者的关联关系,让SAS自动生成嵌套结构。

步骤1:拆分SAS数据集

首先从原始的COMP数据集中拆分出唯一的公司信息表,以及对应的交易明细表:

/* 生成唯一的公司信息主表 */
data COMP_INFO;
    set COMP;
    by COMPANY ADDRESS COUNTRY; /* 按公司及地址分组,确保同公司信息唯一 */
    if first.COMPANY; /* 只保留每个公司的第一条记录 */
    keep COMPANY ADDRESS COUNTRY;
run;

/* 生成交易子表,保留公司关联字段 */
data COMP_TRANS;
    set COMP;
    keep COMPANY TRNS_ID TRNS_CCY;
run;

步骤2:修改XML映射文件

调整你的test.map文件,定义主表与子表的嵌套关系,指定ReportedPayee为父节点,ReportedTransaction为子节点,并通过COMPANY字段关联两者:

<SXLEMAP version="2.1" name="CESOP_Map">
  <NAMESPACES count="0"/>
  <!-- 定义主表:ReportedPayee节点 -->
  <TABLE name="COMP_INFO">
    <TABLE-PATH syntax="XPath">/CESOP/PaymentDataBody/ReportedPayee</TABLE-PATH>
    <COLUMN name="COMPANY">
      <PATH syntax="XPath">/CESOP/PaymentDataBody/ReportedPayee/Name</PATH>
      <TYPE>CHARACTER</TYPE>
      <DATATYPE>STRING</DATATYPE>
    </COLUMN>
    <COLUMN name="ADDRESS">
      <PATH syntax="XPath">/CESOP/PaymentDataBody/ReportedPayee/Address/FreeAddress</PATH>
      <TYPE>CHARACTER</TYPE>
      <DATATYPE>STRING</DATATYPE>
    </COLUMN>
    <!-- 关联子表:指定父表与子表的关联键 -->
    <RELATIONSHIP name="Payee_Transactions" type="CHILD">
      <PARENT-KEYS>
        <KEY name="COMPANY" column="COMPANY"/>
      </PARENT-KEYS>
      <CHILD-TABLE name="COMP_TRANS"/>
    </RELATIONSHIP>
  </TABLE>
  <!-- 定义子表:ReportedTransaction节点 -->
  <TABLE name="COMP_TRANS">
    <TABLE-PATH syntax="XPath">/CESOP/PaymentDataBody/ReportedPayee/ReportedTransaction</TABLE-PATH>
    <COLUMN name="TRNS_ID">
      <PATH syntax="XPath">/CESOP/PaymentDataBody/ReportedPayee/ReportedTransaction/trns_ID</PATH>
      <TYPE>CHARACTER</TYPE>
      <DATATYPE>STRING</DATATYPE>
    </COLUMN>
    <COLUMN name="TRNS_CCY">
      <PATH syntax="XPath">/CESOP/PaymentDataBody/ReportedPayee/ReportedTransaction/trns_CCY</PATH>
      <TYPE>CHARACTER</TYPE>
      <DATATYPE>STRING</DATATYPE>
    </COLUMN>
    <!-- 子表的关联键,用于匹配父表 -->
    <COLUMN name="COMPANY">
      <TYPE>CHARACTER</TYPE>
      <DATATYPE>STRING</DATATYPE>
      <USAGE>KEY</USAGE>
    </COLUMN>
  </TABLE>
</SXLEMAP>

步骤3:导出嵌套XML

使用xmlv2引擎依次写入主表和子表,SAS会根据映射文件的关联关系自动生成嵌套结构:

filename out 'path\compout.xml';
libname out xmlv2 xmltype=xmlmap xmlmap='path\test.map';

/* 先写入主表,再写入子表,确保关联生效 */
data out.COMP_INFO;
   set COMP_INFO;
run;

data out.COMP_TRANS;
   set COMP_TRANS;
run;

libname out clear;

原理说明

原始代码中,SAS会将COMP数据集的每一行都生成一个ReportedPayee节点,导致公司信息重复。通过拆分主从表并在映射文件中定义父子关系,SAS会将同一公司的所有交易记录嵌套到对应的ReportedPayee节点下,完全匹配你需要的XML结构。

内容的提问来源于stack exchange,提问作者Keliimek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:47:18