[英]SAS and XML: XML element name is too long for a SAS variable name
我嘗試使用該代碼:
libname phuse xml 'T:\XX\XX\XX\XX\XX\file_name.xml' xmlmeta=schemadata;
data work.study_abc;
set phuse.study_abc;
run;
但是源文件的變量名太長,出現了SAS:
ERROR: The XML element name <SomeFieldInXMLfileWhereIsTooLong> is too long for a SAS variable name.
ERROR: Encountered during XMLMap parsing at or near line 891, column 53.
我可以在“set”中導入 XML 文件期間重命名字段的現有方法?
謝謝你的幫助!
考慮使用XSLT ,這是一種旨在轉換 XML 文檔(如重命名節點)的專用語言。 您可以使用 SAS 的proc xsl
調用 XSLT 1.0 和 2.0 腳本,然后導入轉換后的 XML 文件。 具體來說,使用帶有單獨模板的身份轉換來重命名位於文檔中任何位置的任何節點的頂級節點。
XSLT (另存為 .xsl 文件,一種特殊的 .xml 文件)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<!-- IDENTITY TRANSFORM -->
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!-- ADJUST match VALUE AND <shortername> NODES -->
<xsl:template match="SomeFieldInXMLfileWhereIsTooLong">
<shortername>
<xsl:apply-templates select="@*|node()"/>
</shortername>
</xsl:template>
</xsl:stylesheet>
SAS
proc xsl
in="C:\Path\To\Input.xml"
out="C:\Path\To\Output.xml"
xsl="C:\Path\To\XSLT_Script.xsl";
run;
libname phuse xml 'C:\Path\To\Output.xml' xmlmeta=schemadata;
data work.study_abc;
set phuse.study_abc;
run;
為了演示,下面的 XML 包括當前排名前五的 StackOverflow SAS 用戶,它們具有非常長的嵌套節點名稱,該節點名稱使用 XSLT 進行轉換,並將其輸出導入到 SAS 中。
<?xml version="1.0"?>
<stackoverflow>
<topsasonstackoverflowusersoverallyear2019>
<user>Joe</user>
<link>https://stackoverflow.com/users/1623007/joe</link>
<year_rep>1,005</year_rep>
<total_rep>56,363</total_rep>
<tag1>sas</tag1>
<tag2>sas-macro</tag2>
<tag3>sql</tag3>
</topsasonstackoverflowusersoverallyear2019>
<topsasonstackoverflowusersoverallyear2019>
<user>Tom</user>
<link>https://stackoverflow.com/users/4965549/tom</link>
<year_rep>6,378</year_rep>
<total_rep>28,990</total_rep>
<tag1>sas</tag1>
<tag2>sas-macro</tag2>
<tag3>sql</tag3>
</topsasonstackoverflowusersoverallyear2019>
<topsasonstackoverflowusersoverallyear2019>
<user>Reeza</user>
<link>https://stackoverflow.com/users/1919583/reeza</link>
<year_rep>1,507</year_rep>
<total_rep>14,671</total_rep>
<tag1>sas</tag1>
<tag2>sas-macro</tag2>
<tag3>sql</tag3>
</topsasonstackoverflowusersoverallyear2019>
<topsasonstackoverflowusersoverallyear2019>
<user>DomPazz</user>
<link>https://stackoverflow.com/users/2734437/dompazz</link>
<year_rep>85</year_rep>
<total_rep>12,001</total_rep>
<tag1>sas</tag1>
<tag2>sas-macro</tag2>
<tag3>sql</tag3>
</topsasonstackoverflowusersoverallyear2019>
<topsasonstackoverflowusersoverallyear2019>
<user>Richard</user>
<link>https://stackoverflow.com/users/1249962/richard</link>
<year_rep>5,075</year_rep>
<total_rep>13,519</total_rep>
<tag1>sas</tag1>
<tag2>sas-macro</tag2>
<tag3>proc-sql</tag3>
</topsasonstackoverflowusersoverallyear2019>
</stackoverflow>
XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="topsasonstackoverflowusersoverallyear2019">
<top_sas_users>
<xsl:apply-templates select="@*|node()"/>
</top_sas_users>
</xsl:template>
</xsl:stylesheet>
SAS
proc xsl
in="C:\Path\To\Input.xml"
out="C:\Path\To\Output.xml"
xsl="C:\Path\To\XSLT_Script.xsl";
run;
libname mydata xml 'C:\Path\To\Output.xml' xmlmeta=schemadata;
data xml_data;
retain user link year_rep total_rep tag1 tag2 tag3;
set mydata.top_sas_users;
run;
proc print data=xml_data; run;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.