I recently created a SharePoint timer job solution that relied on the data in a list as to what the function of the job was to do. The solution requirement was to have a timer job set to run at 8:00am every Thursday that would read SharePoint list data and create a customized email of that data for the week.
Since I work in an environment with multiple SharePoint farms, I had to rely on a ‘settings’ file that I could easily change without having to recompile and redeploy my WSP solutions. I will show you how to read the nodes and values of an XML file located in a SharePoint list that your SharePoint solutions can reference, thus eliminating the need to recompile your code for each SharePoint farm. Let’s get started…
First, let’s assume you have a simple XML file:
<?xml version="1.0" encoding="utf-8" ?> <WSPConfiguration> <SharePointFarm Environment="Production"> <Site> <Url>http://www.royaline.com/articles</Url> <List Name="My Custom List"> <Fields> <Field>EmailTo</Field> <Field>EmailSubject></Field> <Field>EmailBody</Field> </Fields> </List> </Site> </SharePointFarm> <SharePointFarm Environment="Staging"> <Site> <Url>http://staging.royaline.com/articles</Url> <List Name="My Custom List"> <Fields> <Field>EmailTo</Field> <Field>EmailSubject></Field> <Field>EmailBody</Field> </Fields> </List> </Site> </SharePointFarm> <WSPConfiguration>
Remember, the concept of using an XML file as your settings file will let you change the XML without having to recompile your code. If I want (or need) to move my WSP solution to another SharePoint farm, or even have my code point to another SharePoint site or list, I can easily change this XML file as needed.
Since I am the Site Collection Administrator and have access to everything in my site collection, I decided to create a “WSP Settings” document library at my root site collection. I upload all my XML settings files to a project specific subdirectory so I can easily reference it within my Timer job.
Now, when my timer job runs every thursday morning, it will do the following:
To read the XML settings file, add the following code to your project:
private void readXMLSettings()
{
string SETTINGS_XML = "http://www.royaline.com/Lists/WSP%20Settings/MyWSPProjectSettings.xml";
//Create a URI and WebRequest
Uri uri = new Uri(SETTINGS_XML);
WebRequest req = WebRequest.Create(uri);
//Pass in the default credentials
req.UseDefaultCredentials = true;
//Get a web response and create the stream object
WebResponse response = req.GetResponse();
Stream stream = response.GetResponseStream();
//Create an XML document and load the stream into memory
XmlDocument xDoc = new XmlDocument();
xDoc.Load(stream);
//Don't forget to add the 'System.Xml.XPath' namespace.
XPathNavigator xNav = xDoc.CreateNavigator();
//Get the values of each node (or attribute) in the XML settings file
string productionURL = xNav.SelectSingleNode("/WSPConfiguration/SharePointFarm[@Environment='Production']/Url").Value.ToString();
string stagingURL = xNav.SelectSingleNode("/WSPConfiguration/SharePointFarm[@Environment='Staging']/Url").Value.ToString();
//do work
}
While this isn’t a complete example, you can see how I made reference to an XML file in a SharePoint list and read the XML attributes and values into my project. Using XML files in a protected SharePoint list is a good way of eliminating the need to recompile your code to reflect changes to your location or lists.