如何从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
相关产品推荐
相关产品推荐

