Try:
NSXMLElement *number = [query elementForName:@"number" xmlns:@"urn:XYZ:number"];
Namespaces matter. This uses the NSXMLElement category added by XMPPFramework. More details here.
Your XML could also be simplified as such:
<iq from='coven@chat.shakespeare.lit'
id=‘XYZ'
to='hag66@shakespeare.lit/pda'
type='result'>
<query xmlns='urn:XYZ:number'>
<number>4</number>
</query>
</iq>
The namespace on the query
element applies to all child elements.