Como veo que lo que quieres es trastear obviaré los millones de parsers de XML que existen para casi cualquier lenguaje y te daré una recomendación básica para hacerlo a pelo. En una palabra -> PILA.
Pequeña "explicación":
Con POO es más "intuitivo", pero puedes usar cualquier lenguaje que soporte tipos de datos "complejos". C mismo te vale. Tú tienes una pila de objetos inicialmente vacía. Cuando leas la etiqueta <contacto> apilas un objeto de tipo "Etiqueta-contacto" y sigues leyendo. Cuando llegues a la etiqueta <nombre> lo apilas como un objeto de tipo "Etiqueta-nombre" Cuando te leas el nombre lo apilas como un objeto de tipo "cadena" Luego al llegar a la etiqueta de cierre de nombre te vas a la pila y desapilas 2 elementos que serán la cadena que contiene el nombre y el objeto etiqueta de apertura de nombre. Te creas un objeto de tipo "Nombre" y lo apilas. Luego con la edad lo mismo. Al llegar a la etiqueta de cierre de contacto la pila debería contener esto:
[EDAD]
[NOMBRE]
[Apertura de contacto]
Entonces como tú sabes de antemano que un contacto tiene una edad y un nombre sacarás de la pila las 3 cosas, te crearás un objeto de tipo "Contacto" y lo apilarás. Repites lo mismo con el siguiente contacto y al final te quedará un pila que sólo debería contener objetos de tipo "Contacto"
[Contacto-n]
[Contacto2]
[Contacto1]
Para saber cuántas cosas desapilar cada vez que encuentres una etiqueta de cierre es necesario tener definida la gramática del XML, lo que se conoce como DTD del XML -> http://es.wikipedia.org/wiki/Definici%C3%B3n_de_tipo_de_documento
Salu2