Hello Nat
Brenden is correct that you will need more than just the CMS_Document table for this. So something like this should work:
PageTemplateInfo somepagetemplate = PageTemplateInfoProvider.GetPageTemplateInfo(SomeDocument.GetUsedPageTemplateId()); //where "SomeDocument" is a PageInfo object.
string webparts = somepagetemplate.webparts;
webparts is a string of the webparts on the document
you also have access to somepagetemplate.webpartzones which is a collection of WebPartZoneInstance's that you can shuffle through
** after reviewing the previous replies again i see what the issue is that you are having, brenden's solution may be your best bet here -- we do not have anything built in to parse the XML into an object directly, you would simply get the controlid of the webpart and then get the webpartinfo object by that id using the provider.
Hope this helps