It’s impossible to tell what’s wrong with our code snippets, you have to create working minimal examples.
The following example shows where you have to take care of extra space and you don’t need them when you put the whole table in a \vbox (you can test by commenting all \ignorespaces and \removeunwantedspaces commands and replacing \ruledhbox with \ruledvbox).
\startxmlsetups xmlcommon
\xmlsetsetup{\xmldocument}{table|tbody|tr|td}{xmlcommon:*}
\stopxmlsetups
\xmlregistersetup{xmlcommon}
\startxmlsetups xmlcommon:table
% \removeunwantedspaces
\startembeddedxtable
\xmlflush{#1}
\stopembeddedxtable
\ignorespaces
\stopxmlsetups
\startxmlsetups xmlcommon:tbody
% \removeunwantedspaces
\startxtablebody
\xmlflush{#1}
\stopxtablebody
\ignorespaces
\stopxmlsetups
\startxmlsetups xmlcommon:tr
% \removeunwantedspaces
\startxrow
\xmlflush{#1}
\stopxrow
\ignorespaces
\stopxmlsetups
\startxmlsetups xmlcommon:td
\removeunwantedspaces
\startxcell
\xmlflush{#1}
\stopxcell
\ignorespaces
\stopxmlsetups
\starttext
\startbuffer[table]
<?xml version="1.0" encoding="UTF-8"?>
<root>
<table>
<tbody>
<tr>
<td>A</td>
<td>B</td>
</tr>
<tr>
<td>C</td>
<td>D</td>
</tr>
</tbody>
</table>
</root>
\stopbuffer
\ruledhbox{\xmlprocessbuffer{root}{table}{}}
\stoptext
Wolfgang