Programmatically retrieve the GPRS’ APN configured for a Mobile Operator (XPath on Windows Mobile)

This was a good exercise as it showed how powerful XPath queries are, this time for XML Provisioning... Basically what the developer was interested on was the GPRSInfoAccessPointName of the CM_GPRSEntries Configuration Service Provider. The XML Provisioning Query was:

 <wap-provisioningdoc>
    <characteristic-query type="CM_GPRSEntries" />
</wap-provisioningdoc>

Once you have the desired query-xml, you can programmatically run it from within a NETCF v2.0 application by using the ConfigurationManager.ProcessConfiguration method (ConfigurationManager is a class of the Microsoft.WindowsMobile.Configuration namespace, defined in the Microsoft.WindowsMobile.Configuration.dll assembly).

The code is:

 XmlDocument configDoc = new XmlDocument();
configDoc.LoadXml(
    "<wap-provisioningdoc>" +
    "<characteristic-query type=\"CM_GPRSEntries\" />" +
    "</wap-provisioningdoc>");
XmlDocument output = ConfigurationManager.ProcessConfiguration(configDoc, true);

Now that you have a XmlDocument, you can use a XPath string to search the value you want: you can look at the resulting xmloutput of the RapiConfig in order to find the correct XPath string, which in this particular case is:

 /wap-provisioningdoc/characteristic/characteristic[@type="<INSERT GPRS ENTRY HERE>"]/characteristic/parm[@name="GPRSInfoAccessPointName"]

I recommend using RapiConfig precisely in order to verify what’s the GPRS ENTRY name is configured in your case, otherwise the application may not work. In my testings I tried with a GPRS operator of mine (“TIM”). In NETCF, you can run a XPath query by using the .SelectSingleNode() or .SelectNodes() methods of the class XmlDocument:

 XmlNode aux = output.SelectSingleNode(
    "/wap-provisioningdoc/characteristic/characteristic[@type=\"" + 
    OperatorSettingToBeSearched + 
    "\"]/characteristic/parm[@name=\"GPRSInfoAccessPointName\"]");

 

In conclusion, the sample code you may customize is (this was a NETCF v2.0 Console application):

 static string OperatorSettingToBeSearched = "TIM";
static void Main(string[] args)
{
    XmlDocument configDoc = new XmlDocument();
    configDoc.LoadXml(
        "<wap-provisioningdoc>" +
            "<characteristic-query type=\"CM_GPRSEntries\" />" +
        "</wap-provisioningdoc>");
    XmlDocument output = ConfigurationManager.ProcessConfiguration(configDoc, true);
    XmlNode aux = output.SelectSingleNode("/wap-provisioningdoc/characteristic/characteristic[@type=\"" +
        OperatorSettingToBeSearched + 
        "\"]/characteristic/parm[@name=\"GPRSInfoAccessPointName\"]");
    MessageBox.Show(aux.Attributes["value"].Value);
}