2

I have some XML data which I'm trying to read into SAS 9.1.3 through the XML libname engine. Said XML data looks a lot like this (some may recognise that's it's output from PROC METADATA):

<?xml version="1.0" encoding="windows-1252"?>
<GetMetadataObjects>
  <Reposid>A0000001.AREPOSID</Reposid>
  <Type>Person</Type>
  <Objects>
    <Person Id="AREPOSID.AA000001" Name="User The 1st">
      <Logins/>
    </Person>
    <Person Id="AREPOSID.AA000002" Name="User The 2nd">
      <Logins>
        <Login Id="AREPOSID.AV000001" UserID="AUserID">
          <Domain>
            <AuthenticationDomain Id="AREPOSID.AD000001" Name="DefaultAuth"/>
          </Domain>
        </Login>
        <Login Id="AREPOSID.AV000002" UserID="AlsoUserID">
          <Domain>
            <AuthenticationDomain Id="AREPOSID.AD000002" Name="DummyAuth"/>
          </Domain>
        </Login>
      </Logins>
    </Person>
    <Person Id="AREPOSID.AA000003" Name="Person The 3rd">
      <Logins/>
    </Person>
  </Objects>
  <NS>SAS</NS>
  <Flags>260</Flags>
  <Options>
    <Templates>
      <Person Id="" Name="">
        <Logins Id=""/>
      </Person>
      <Logins>
        <Login/>
      </Logins>
      <Login Id="" Userid="">
        <Domain/>
      </Login>
      <Domain> 
        <AuthenticationDomain/>
      </Domain>
      <AuthenticationDomain Name=""/>
    </Templates>
  </Options>
</GetMetadataObjects>

The above XML is associated with a file reference called xml_out, and I'm using the following code to read it into a SAS dataset:

filename xml_map temp;
data _NULL_;
  file xml_map;
  put 
    '<?xml version="1.0" encoding="windows-1252"?>'
    /   '<SXLEMAP xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="TreeMap" version="1.2" xsi:noNamespaceSchemaLocation="http://www.sas.com/xml/schema/sxle12.xsd">'
    /   '    <TABLE name="user_logins">'
    /   '       <TABLE-PATH syntax="XPath">/GetMetadataObjects/Objects/Person/Logins/Login</TABLE-PATH>'
    /   '        <COLUMN name="UserMetaId">'
    /   '            <PATH syntax="XPath">/GetMetadataObjects/Objects/Person/@Id</PATH>'
    /   '            <TYPE>character</TYPE>'
    /   '            <DATATYPE>string</DATATYPE>'
    /   '            <LENGTH>200</LENGTH>'
    /   '        </COLUMN>'
    /   '        <COLUMN name="UserMetaName">'
    /   '            <PATH syntax="XPath">/GetMetadataObjects/Objects/Person/@Name</PATH>'
    /   '            <TYPE>character</TYPE>'
    /   '            <DATATYPE>string</DATATYPE>'
    /   '            <LENGTH>200</LENGTH>'   
    /   '        </COLUMN>'
    /   '        <COLUMN name="LoginsGroup">'
    /   '            <PATH syntax="XPath">/GetMetadataObjects/Objects/Person/Logins/@Id</PATH>'
    /   '            <TYPE>character</TYPE>'   
    /   '            <DATATYPE>string</DATATYPE>'   
    /   '            <LENGTH>200</LENGTH>'
    /   '        </COLUMN>' 
    /   '        <COLUMN name="LoginDomain">'   
    /   '            <PATH syntax="XPath">/GetMetadataObjects/Objects/Person/Logins/Login/Domain/AuthenticationDomain/@Name</PATH>'   
    /   '            <TYPE>character</TYPE>'
    /   '            <DATATYPE>string</DATATYPE>'
    /   '            <LENGTH>200</LENGTH>'
    /   '        </COLUMN>'   
    /   '        <COLUMN name="LoginId">'
    /   '            <PATH syntax="XPath">/GetMetadataObjects/Objects/Person/Logins/Login/@Id</PATH>'
    /   '            <TYPE>character</TYPE>'   
    /   '            <DATATYPE>string</DATATYPE>'   
    /   '            <LENGTH>200</LENGTH>'
    /   '        </COLUMN>'   
    /   '    </TABLE>'
    /   '</SXLEMAP>'
  ;
run;
libname xml_out xml xmlfileref=xml_out xmlmap=xml_map;
data logins_details_test;
  set xml_out.user_logins;
run;

The output data from this procedure looks like this:

UserMetaId         UserMetaName  LoginDomain  LoginId
---------------------------------------------------------------
AREPOSID.AA000002  User The 2nd  DefaultAuth  AREPOSID.AV000001
                                 DummyAuth    AREPOSID.AV000002

Can anybody suggest what I'd need to change in either the xml map, or in the libname statement so that I get either 1 row per login found, or a single row with no login details if no login details are visible? i.e.

UserMetaId         MetaName      LoginDomain  LoginId
---------------------------------------------------------------
AREPOSID.AA000001  User The 1st
AREPOSID.AA000002  User The 2nd  DefaultAuth  AREPOSID.AV000001
AREPOSID.AA000002  User The 2nd  DummyAuth    AREPOSID.AV000002
AREPOSID.AA000003  User The 3rd
flag

1 Answer

3

Hi Willliam

you can make use of the retain="YES" attribute on a column. in the map.

To get the end result, you will need to define two tables: - the one you already have - and one that just goes down to the Person /GetMetadataObjects/Objects/Person

link|flag

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.