SharePoint: Read XML File from Document Library
Introduction
As we know the implementation of XDocument.Load(string) doesn't support an authenticated request to retrieve the XML file so we can use the Stream or FileStream to read the file directly. Otherwise, you will get a 401 error.
Applies to
This code is tested in SP 2010 but should work in other versions as well.
Read a file
If you want to read a file using an application from client machine then use below code:
string strFileURL = "http://servername/sites/TestSite/TestLib/Text.xml ";
WebClient webClient = new WebClient();
webClient.Credentials = CredentialCache.DefaultCredentials
using (StreamReader reader = new StreamReader(webClient.OpenRead(strFileURL))
{
XDocument Xdoc = XDocument.Parse(reader.ReadToEnd());
}
Issue
Note: If your XML is a fragment rather than a fully formed XML document then you may expect below error.
Error: There are multiple root elements, line, position.
Workaround
Use XmlDocument class to accept fragment. Ref Link (http://forums.asp.net/t/1234195.aspx
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(string.Format("<root>{0}</root>",reader.ReadToEnd));
string value = xmlDocument.SelectSingleNode("root/app.Status").InnerText;
COM
If you want to read a file using client object model then use below code:
ClientContext context = new ClientContext("http://servername/sites/TestSite");
context.ExecuteQuery();
Uri testuri = new Uri(strFileURL);
FileInformation info = File.OpenBinaryDirect(context, testuri.AbsolutePath);
using (StreamReader reader = new StreamReader(info.Stream))
{
XDocument Xdoc = XDocument.Parse(reader.ReadToEnd());
xDoc = xdoc.ToXmlDocument();
}
SOM
If you want to read a file using server object model then use below code:
string site = "http://servername/sites/TestSite";
using(SPSite spsite = new SPSite(site))
{
using(SPWeb spweb = spsite.OpenWeb())
{
SPFile file = spweb.GetFile(strFileURL);
StreamReader reader = new StreamReader(file.OpenBinaryStream());
XDocument xdoc = XDocument.Parse(reader.ReadToEnd());
xDoc = xdoc.ToXmlDocument();
reader.Close()
}}