SAS Metadata is powerful and often misunderstood. By breaking everything down into objects, properties and associations (split by type), pretty much anything in SAS can be stored.

The best way to extract metadata using the SAS language is using proc metadata - no chance of infinite loops (like in a datastep) and it's usually more efficient. However, you do have to deal with the XML structure. Below is an example of using proc metadata with an XML map against the output, allowing the XML to be read in as a datastep. The code retrieves the list of types from metadata.

* use a temporary fileref to hold the response;
filename response temp;
/* get list of libraries */
proc metadata in=
   <!-- specify the OMI_SUCCINCT flag -->
     <!-- include <REPOSID> XML element and a repository identifier -->

/* write the response to the log for debugging */
data _null_;
  infile response lrecl=1048576;
  put _infile_;

/* create an XML map to read the response */
filename sxlemap temp;
data _null_;
  file sxlemap;
  put '<SXLEMAP version="1.2" name="SASTypes"><TABLE name="SASTypes">';
  put '<TABLE-PATH syntax="XPath">//GetTypes/Types/Type</TABLE-PATH>';
  put '<COLUMN name="ID">';
  put '<PATH syntax="XPath">//GetTypes/Types/Type/@Id</PATH></COLUMN>';
  put '<COLUMN name="Desc">';
  put '<PATH syntax="XPath">//GetTypes/Types/Type/@Desc</PATH></COLUMN>';
  put '<COLUMN name="HasSubtypes">';
  put '<PATH syntax="XPath">//GetTypes/Types/Type/@HasSubtypes</PATH></COLUMN>';
  put '</TABLE></SXLEMAP>';
libname _XML_ xml xmlfileref=response xmlmap=sxlemap;
/* sort the response by library name */
proc sort data=_XML_.sastypes out=sastypes;
  by id;

/* clear references */
filename sxlemap clear;
filename response clear;
libname _XML_ clear;