One of the most confounding things about working with the SharePoint web services is that the return values are all in XML strings (wrapped in an XmlNode).
To make working with the services even more puzzling, suppose you get a result like so:
<ContentType ID="0x010100347433A509750F4D88880291599D314D04" Name="My Content Type" Group="My Custom Content Types" Version="7" xmlns="http://schemas.microsoft.com/sharepoint/soap/"> <Folder TargetName="_cts/My Content Type" /> <Fields> <Field ... /> <Field ... /> <Field ... /> <Field ... /> </Fields> <XmlDocuments> <XmlDocument NamespaceURI="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <FormTemplates xmlns="http://schemas.microsoft.com/sharepoint/v3/contenttype/forms"> <Display>DocumentLibraryForm</Display> <Edit>DocumentLibraryForm</Edit> <New>DocumentLibraryForm</New> </FormTemplates> </XmlDocument> </XmlDocuments> </ContentType>
You would expect to be able to retrieve all of the <Field /> elements by executing the following code:
XmlNodeList nodes = xmlResponse.SelectNodes("//Field");
But it's not quite so straight forward. You actually have to instantiate an XmlNamespaceManager with a bogus prefix:
NameTable table = new NameTable();
XmlNamespaceManager manager = new XmlNamespaceManager(table);
XmlNodeList nodes = xmlResponse.SelectNodes("//sp:Field", manager);
In this case, I used "sp" as my prefix. Notice that it's utilized in the XPath query as well.