如何从 SAS 生成正确的 XML

问题描述 投票:0回答:1

我需要将数据从 SAS 数据库导出到 XML 文件。 XML结构是第三方定义的,所以必须遵循。

我创建了一个定义 XML 的映射文件,但我不知道如何合并数据以使某些值不重复。基本上如何在表中创建一个表。 (我无法复制所需的结构。)

对于一家公司,我需要输入地址和所有交易的列表。但现在我在 XML 中为表中的每一行获取 1 条记录。

我需要如下输出

<CESOP>
    <PaymentDataBody>
        <ReportedPayee>
            <Name>COMPANY1</Name>
            <Address>
                <FreeAddress>Address 1</FreeAddress>
            </Address>
            <ReportedTransaction>
                <trns_ID>TRNS1</trns_ID>
                <trns_CCY>EUR</trns_CCY>
            </ReportedTransaction>
            <ReportedTransaction>
                <trns_ID>TRNS2</trns_ID>
                <trns_CCY>USD</trns_CCY>
            </ReportedTransaction>
        </ReportedPayee>
        <ReportedPayee>
            <Name>COMPANY2</Name>
            <Address>
                <FreeAddress>Address 1</FreeAddress>
            </Address>
            <ReportedTransaction>
                <trns_ID>TRNS1</trns_ID>
                <trns_CCY>EUR</trns_CCY>
            </ReportedTransaction>
        </ReportedPayee>
    </PaymentDataBody>
</CESOP>

但是我得到了这个:

<CESOP>
    <PaymentDataBody>
        <ReportedPayee>
            <Name>COMPANY1</Name>
            <Address>
                <FreeAddress>Address 1</FreeAddress>
            </Address>
            <ReportedTransaction>
                <trns_ID>TRNS1</trns_ID>
                <trns_CCY>EUR</trns_CCY>
            </ReportedTransaction>
        </ReportedPayee>
        <ReportedPayee>
            <Name>COMPANY1</Name>
            <Address>
                <FreeAddress>Address 1</FreeAddress>
            </Address>
            <ReportedTransaction>
                <trns_ID>TRNS2</trns_ID>
                <trns_CCY>USD</trns_CCY>
            </ReportedTransaction>
        </ReportedPayee>
        <ReportedPayee>
            <Name>COMPANY2</Name>
            <Address>
                <FreeAddress>Address 1</FreeAddress>
            </Address>
            <ReportedTransaction>
                <trns_ID>TRNS1</trns_ID>
                <trns_CCY>EUR</trns_CCY>
            </ReportedTransaction>
        </ReportedPayee>
    </PaymentDataBody>
</CESOP>

SAS 代码:

data COMP;
    length COMPANY $200. ADDRESS $200.  COUNTRY $200. TRNS_ID $200. TRNS_CCY $3;
    infile datalines dlm = '|';
    input COMPANY ADDRESS COUNTRY TRNS_ID TRNS_CCY;
    datalines;
COMPANY1|Address 1|CZ|TRNS1|EUR
COMPANY1|Address 1|CZ|TRNS2|USD
COMPANY2|Address 1|DE|TRNS1|EUR
run;

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

data out.COMP;
   set COMP;
run;
xml sas xmlmapper
1个回答
0
投票

XML 文件只是一个文本文件。所以只需使用普通的 SAS 方法来写入文本文件即可。

data _null_;
  file OUT ;
  if _n_=1 then put '<CESOP>' / @3 '<PaymentDataBody>';
  if eof then put @3 '</PaymentDataBody>' / '</CESOP>';

  set comp end=eof;
  by company ;
  if first.company then put 
   @5 '<ReportedPayee>'
 / @7 '<Name>' COMPANY +(-1) '</Name>'
 / @7 '<Address>'
 / @9 '<FreeAddress>' ADDRESS +(-1) '</FreeAddress>'
 / @7 '</Address>'
  ;
  put 
   @7 '<ReportedTransaction>'
 / @9 '<trns_ID>' TRNS_ID +(-1) '</trns_ID>'
 / @9 '<trns_CCY>' TRNS_CCY +(-1) '</trns_CCY>'
 / @7 '</ReportedTransaction>'
  ;
  if last.company then put 
   @5 '</ReportedPayee>'
  ;
run;

结果

<CESOP>
  <PaymentDataBody>
    <ReportedPayee>
      <Name>COMPANY1</Name>
      <Address>
        <FreeAddress>Address 1</FreeAddress>
      </Address>
      <ReportedTransaction>
        <trns_ID>TRNS1</trns_ID>
        <trns_CCY>EUR</trns_CCY>
      </ReportedTransaction>
      <ReportedTransaction>
        <trns_ID>TRNS2</trns_ID>
        <trns_CCY>USD</trns_CCY>
      </ReportedTransaction>
    </ReportedPayee>
    <ReportedPayee>
      <Name>COMPANY2</Name>
      <Address>
        <FreeAddress>Address 1</FreeAddress>
      </Address>
      <ReportedTransaction>
        <trns_ID>TRNS1</trns_ID>
        <trns_CCY>EUR</trns_CCY>
      </ReportedTransaction>
    </ReportedPayee>
  </PaymentDataBody>
</CESOP>
© www.soinside.com 2019 - 2024. All rights reserved.