XQuery es un lenguaje para hacer consultas bien formadas sobre documentos xml. Combinado con TagSoup, que permite parsear cualquier documento html como si fuera xml, y un procesador de documentos como Nux es muy facil consumir microformatos de cualquier web.
Como supuesto veamos como consumir el hcard de uno de mis sitios favoritos en 11870, el café Costello.
XQuery está basado en XPath pero además nos permite hacer consultas más cercanas al sql. La consulta para extraer del dom de un documento xml un elemento cuyo atributo contenga la palabra vcard podría ser así:
String query = "declare namespace xhtml=\"http://www.w3.org/1999/xhtml\"; \n" +
" for $data in //xhtml:* \n"+
" where contains($data/@class, \"vcard\") \n" +
" return { data($data) } ";
Refinandola un poco más podríamos decir que solo queremos mostrar unos cuantos nodos, como los que contengan el nombre, dirección, localidad, provincia y país del sitio:
String query = "declare namespace xhtml=\"http://www.w3.org/1999/xhtml\"; \n" +
"for $data in //xhtml:* \n"+
" where contains($data/@class, \"vcard\") \n"+
" return <vcard> \n" +
" <fn> { data($data//xhtml:*[contains(@class, \"fn\")]) } </fn>" +
" <street-address> { data($data//xhtml:*[contains(@class, \"street-address\")]) } </street-address>" +
" <locality> { data($data//xhtml:*[contains(@class, \"locality\")]) } </locality>" +
" <region> { data($data//xhtml:*[contains(@class, \"region\")]) } </region>" +
" <country-name> { data($data//xhtml:*[contains(@class, \"country-name\")]) } </country-name>" +
" </vcard> ";
Una vez tenemos la consulta, podemos obtener el html haciendo una llamada por get a la dirección de nuestra página:
GetMethod get = new GetMethod("http://11870.com/pro/20770");
get.setFollowRedirects(true);
HttpClient httpClient = new HttpClient();
httpClient.executeMethod(get);
InputStream in = get.getResponseBodyAsStream();
Y transformar el html en xml para ejecutar nuestra consulta xquery:
XMLReader parser = new org.ccil.cowan.tagsoup.Parser();
Document doc = new Builder(parser).build(in);
Nodes results = XQueryUtil.xquery(doc, query);
La variable results almacenaría el resultado de ejecutar la consulta, donde quedaría un xml parecido a este:
<vcard>
<fn>Costello Cafe</fn>
<street-address>Calle del Caballero de Gracia 10</street-address>
<locality>Madrid</locality>
<region>Madrid</region>
<country-name>España</country-name>
</vcard>
TagSoup facilita bastante la tediosa tarea de parsear un html ya que transforma hasta los documentos peor formados, y con unos conocimientos de xquery las posiblidades son casi infinitas. Todo el código del ejemplo se puede descargar de aqui.

La traducción de la consulta sería :
del elemento cuyo atributo "class" contiene "vcard" dame los elementos cuyos atributos "class" contengan "fn", "street-address", "locality", "region" y "country"
con lo cual, no importa que tipo de elementos sean ni lo que tengan entre medio.