Q:

Why does SelectSingleElement work for some queries, but not others?

I have the following snippet of XML (Zimbra SOAP API if anyone cares, but it is not important)
<appt id="266" uid="bf177af2-2875-447a-8e74-d9bc8c108611" nextAlarm="1409547300000" d="1380213518000" rev="63" s="0" l="10" xmlns="urn:zimbraMail">
  <inv id="265" seq="3" compNum="0" type="appt">

I have an XmlElement which contains this snippet. I have set up a namespace manager etc, as follows
XmlNamespaceManager ns = new XmlNamespaceManager(element.OwnerDocument.NameTable);
ns.AddNamespace("prefix", "urn:zimbraMail");

The following code 
element.SelectSingleNode("//prefix:" + "appt/@id", ns).Value

returns 266 as expected
but I cannot manage to select appt, appt/inv or anything else, except for basically the attributes of appt.  Here are a few of the queries I have tried. Some return null, some return bad format (as I was thrashing around)
element.SelectSingleNode("//prefix:" + "appt/inv", ns).Value
element.SelectSingleNode("//prefix:" + "/appt/inv", ns).Value
element.SelectSingleNode("//prefix:" + "/inv", ns).Value
element.SelectSingleNode("//prefix:" + "appt", ns).Value

I've also tried not including the prefixes etc. Any help? Part of the issue may be that OwnerDoc is a SOAP envelope, which could be screwing up the namespaces, but then why would the first query work? (Incidentally, the first query works even without using the prefix/namespace logic)

A:

You need to qualify all elements, not just the first one. So:
//prefix:appt/inv

Should be:
//prefix:appt/prefix:inv

The bad format exception is due to the following, because element names can't start with /:
//prefix:/appt/inv
//prefix:/inv

