XML 映射的 PATH 元素中的 POSITION() 函数在 XML 映射器中有效,但在 SAS 代码中无效

2024-03-20

我正在尝试将 xml 文件导入到 SAS。 Xml 文件是 Google 对地址请求的“地理响应”。这是它的片段:

<address_component>
  <long_name>1025</long_name>
  <short_name>1025</short_name>
  <type>street_number</type>
</address_component>
<address_component>
  <long_name>Gilford Street</long_name>
  <short_name>Gilford St</short_name>
  <type>route</type>
 </address_component>
 <address_component>
  <long_name>West End</long_name>
  <short_name>West End</short_name>
  <type>neighborhood</type>
  <type>political</type>
</address_component>
<address_component>
  <long_name>Vancouver</long_name>
  <short_name>Vancouver</short_name>
  <type>locality</type>
  <type>political</type>
</address_component>

您可以获取完整的 xml 文件,在浏览器中输入以下 url:http://maps.googleapis.com/maps/api/geocode/xml?address=1025,+Gilford+Street,+Vancouver&sensor=false

我想将其转换为 SAS 数据集,如下所示:

type              long_name

street_number      1025
route              Gilford St
neighborhood       West End

etc

正如您所看到的,一些 (address_component) 元素内部只有一个 (type) 元素(如 street_number 或路线),但其他元素有两个:第一个具有感兴趣的值(例如“neighborhood”),第二个具有值“政治”,我不需要。 因此,我使用函数 POSITION()=1 在 XML Mapper 中创建了 XML-map,以确保仅使用第一次出现的 (type)-标签:

<NAMESPACES count="0"/>

<!-- ############################################################ -->
<TABLE name="GeoResponse">
    <TABLE-PATH syntax="XPath">/GeocodeResponse/result/address_component</TABLE-PATH>

    <COLUMN name="type">
        <PATH syntax="XPath">/GeocodeResponse/result/address_component/type[position()=1]</PATH>
        <TYPE>character</TYPE>
        <DATATYPE>string</DATATYPE>
        <LENGTH>27</LENGTH>
    </COLUMN>

    <COLUMN name="long_name">
        <PATH syntax="XPath">/GeocodeResponse/result/address_component/long_name</PATH>
        <TYPE>character</TYPE>
        <DATATYPE>string</DATATYPE>
        <LENGTH>17</LENGTH>
    </COLUMN>

</TABLE>

它在 XML Mapper 本身中正常工作(在“表视图”选项卡中)。但是,当我在 SAS EG 或 SAS Base 中使用此映射运行代码时,“类型”列为空。 如果我不在地图中使用 POSITION()=1,那么一切都会正常运行(但对于除 strett_number、route 和 postal_code 之外的所有项目,我的类型都是“政治”,而不是“城市”、“国家”等) 。

有人知道问题出在哪里吗?


在 SAS 9.3 上运行。版本之间的 XML 处理存在差异。

我无法获得基本地图来完成您正在寻找的任务。这position()=1看起来它绝对应该做你想做的事。

所以我写了一个小数据步骤来过滤掉“政治”行。

我让这个工作:

filename in url 'http://maps.googleapis.com/maps/api/geocode/xml?address=1025,+Gilford+Street,+Vancouver&sensor=false';

filename SXLEMAP "c:\temp\google.map";
data _null_;
file SXLEMAP;
put '<SXLEMAP name="SXLEMAP" version="2.1">';
put '<NAMESPACES count="0"/>';

put '<TABLE name="GeoResponse">';
put '    <TABLE-PATH syntax="XPath">/GeocodeResponse/result/address_component</TABLE-PATH>';

put '   <COLUMN name="type">';
*put '       <PATH syntax="XPath">/GeocodeResponse/result/address_component/type[position()=1]</PATH>';
put '        <PATH syntax="XPath">/GeocodeResponse/result/address_component/type</PATH>';
put '        <TYPE>character</TYPE>';
put '        <DATATYPE>string</DATATYPE>';
put '        <LENGTH>27</LENGTH>';
put '    </COLUMN>';

put '    <COLUMN name="long_name">';
put '        <PATH syntax="XPath">/GeocodeResponse/result/address_component/long_name</PATH>';
put '        <TYPE>character</TYPE>';
put '        <DATATYPE>string</DATATYPE>';
put '        <LENGTH>17</LENGTH>';
put '    </COLUMN>';

put '</TABLE>';
put '</SXLEMAP>';
run;

filename  google 'c:\temp\google.xml';
data _null_;
file google;
infile in;
input;
if ^index(_infile_,"political") then
   put _infile_;
run;

libname   google xmlv2 xmlmap=SXLEMAP access=READONLY;

proc print data=google.georesponse;
run;

产生这个:

             Obs    type                           long_name

               1    street_number                  1025
               2    route                          Gilford Street
               3    neighborhood                   West End
               4    locality                       Vancouver
               5    administrative_area_level_2    Greater Vancouver
               6    administrative_area_level_1    British Columbia
               7    country                        Canada
               8    postal_code                    V6G 1R2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XML 映射的 PATH 元素中的 POSITION() 函数在 XML 映射器中有效,但在 SAS 代码中无效 的相关文章

随机推荐