SharePoint Tips

Thursday, November 16, 2017

C# - Create Static XML Node

public static void CreateStaticXmlNode(XmlDocument xmlDoc, XmlNode parentNode)
{
//Node 1
XmlNode childNodeOne = xmlDoc.CreateElement("MFITEM");
XmlAttribute attMFTYPE = xmlDoc.CreateAttribute("TYPE");
attMFTYPE.InnerText = "FILE";
childNodeOne.Attributes.Append(attMFTYPE);
XmlAttribute attMFKEY = xmlDoc.CreateAttribute("KEY");
attMFKEY.InnerText = "FileName.pdf";
childNodeOne.Attributes.Append(attMFKEY);
XmlNode nodeMFTitle = xmlDoc.CreateElement("TITLE");
nodeMFTitle.InnerText = "<![CDATA[Test Form]]>";
childNodeOne.AppendChild(nodeMFTitle);
parentNode.AppendChild(childNodeOne);
//Node 2
XmlNode childNodeTwo = xmlDoc.CreateElement("MFITEM");
XmlAttribute attIncSheetType = xmlDoc.CreateAttribute("TYPE");
attIncSheetType.InnerText = "FILE";
childNodeTwo.Attributes.Append(attIncSheetType);
XmlAttribute attSK = xmlDoc.CreateAttribute("KEY");
attSK.InnerText = "FileName.pdf";
childNodeTwo.Attributes.Append(attSK);
XmlNode childNodeTwoTitle = xmlDoc.CreateElement("TITLE");
childNodeTwoTitle.InnerText = "<![CDATA[Test Text]]>";
childNodeTwo.AppendChild(childNodeTwoTitle);
parentNode.AppendChild(childNodeTwo);
}

CSOM - Get Document metadata from SharePoint Library - C#

public ListItemCollection GetDocumentMetaData(ClientContext clientContext, string libraryName)
{
ListItemCollection items = null;
try
{
 // true to enable 100-Continue behavior.The default value is true.
ServicePointManager.Expect100Continue = true;
  // Default .Net SecurityProtocol. To disable SSL fallback
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

List library = clientContext.Web.Lists.GetByTitle(libraryName);

clientContext.Load(library);
clientContext.Load(library.RootFolder);
clientContext.Load(library.RootFolder.Folders);
clientContext.Load(library.RootFolder.Files);
clientContext.ExecuteQuery();

if (library != null && library.ItemCount > 0)
{
// Add all your CAML query conditions in below variable
List<string> conditions = new List<string>();
CamlQuery camlQuery = new CamlQuery();
string serverRelativeUrl = library.RootFolder.ServerRelativeUrl + "/Folder Name";
camlQuery.FolderServerRelativeUrl = serverRelativeUrl;
string viewXml = @"<View Scope='Recursive'>
<Query><Where>" + conditions +
   @"</Where></Query>                           
</View>";
camlQuery.ViewXml = viewXml;

items = library.GetItems(camlQuery);

clientContext.Load(items, listItems => listItems.Include
(item => item.FileSystemObjectType,
item => item.ContentType,
item => item.DisplayName,
item => item["FileLeafRef"],
item => item["Modified"],
item => item["Title"],
item => item["FileRef"],
item => item["CustomField1"],
item => item["CustomField2"],
item => item["Created"]));
clientContext.ExecuteQuery();

}

}
catch (Exception exec)
{
logger.WriteEventLog("Please contact admin : " + exec.Message);
throw exec;
}
int count = items.Count;
return items;
}

Method to merge multiple Or, And condition in same CAML query - C# CSOM

enum MergeType { Or, And };


        /// <summary>
        /// Use this method to merge multiple Or, And condition in same CAML query for same or different columns
        /// </summary>
        /// <param name="conditions"></param>
        /// <param name="type"></param>
        /// <returns></returns>
        private string MergeCAMLConditions(List<string> conditions, MergeType type)
        {
            try
            {
                if (conditions.Count == 0) return "";
                string typeStart = (type == MergeType.And ? "<And>" : "<Or>"); string typeEnd = (type == MergeType.And ? "</And>" : "</Or>");
                // Build hierarchical structure 
                while (conditions.Count >= 2)
                {
                    List<string> complexConditions = new List<string>();
                    for (int i = 0; i < conditions.Count; i += 2)
                    {
                        if (conditions.Count == i + 1)
                            // Only one condition left             
                            complexConditions.Add(conditions[i]);
                        else
                            // Two condotions - merge             
                            complexConditions.Add(typeStart + conditions[i] + conditions[i + 1] + typeEnd);
                    }
                    conditions = complexConditions;
                }
            }
            catch (Exception exec)
            {
                logger.WriteEventLog("Please contact admin : " + exec.Message);
                throw exec;
            }
            return conditions[0];
        }


How to use this method:

List<string> conditions = new List<string>();
 foreach (string id in ids)
  {
      conditions.Add("<Eq><FieldRef Name='Model' /><Value Type='Text'>" + id + "</Value></Eq>");
  }
string merged = MergeCAMLConditions(conditions, MergeType.Or);

string viewXml = @"<View Scope='Recursive'>
                                            <Query><Where>" + merged +
                                       @"</Where></Query>                           
                                        </View>";
camlQuery.ViewXml = viewXml;

CSOM Method to return list data from SharePoint - C#

        /// <summary>
        /// CSOM method to return list data from SharePoint
        /// </summary>
        /// <param name="clientContext"></param>
        /// <returns></returns>
        public ListItemCollection LoadListData(ClientContext clientContext)
        {
            Web site = clientContext.Web;
            List oList = clientContext.Web.Lists.GetByTitle("ListName");
            CamlQuery camlQuery = new CamlQuery();
            camlQuery.ViewXml = @"<View Scope='Recursive'>
                                            <Query></Query>
                                        </View>";
            ListItemCollection collListItem = oList.GetItems(camlQuery);

            clientContext.Load(collListItem, listItems => listItems.Include
                                           (item => item["Column1"],
                                            item => item["Column2"]));

            clientContext.ExecuteQuery();
            return collListItem;
        }

Format XML - C#, Replace Special Characters from XML File

public class FormatXML
    {
        /// <summary>
        /// Read the xml file to string
        /// </summary>
        /// <param name="fileName">full file path</param>
        /// <returns></returns>
        public string ReadXmlFile(string fileName)
        {
            string xmlString = System.IO.File.ReadAllText(fileName);
            return xmlString;
        }

/// <summary>
        /// Replace special characters from xml file
        /// </summary>
        /// <param name="fileName">full file path</param>
        /// <returns></returns>
        public string ReplaceSpecialChar(string fileName)
        {
            string xmlString = ReadXmlFile(fileName);
            xmlString = xmlString.Replace("&lt;", "<").Replace("&gt;", ">");
            return xmlString;
        }
    }

Download File from SharePoint CSOM C#

public class DownloadFile
    {
        Logger logger = new Logger();
        public void FileRef(ListItem item, ClientContext clientContext)
        {
            try
            {
                string strFileRelativeUrl = string.Empty;
                string tempLocation = CreateDirectory();
                if (item != null)
                {

                    strFileRelativeUrl = item["FileRef"].ToString();
                    string fileName = strFileRelativeUrl.Substring(strFileRelativeUrl.LastIndexOf('/') + 1);
                    if (!string.IsNullOrEmpty(strFileRelativeUrl))
                    {
                        // string fileName = System.IO.Path.GetFileName(mf.FileRef);
                        clientContext.ExecuteQuery();
                        //download

                        FileInformation fromFileInfo = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, strFileRelativeUrl);
                        clientContext.ExecuteQuery();

                        Stream fs = Microsoft.SharePoint.Client.File.OpenBinaryDirect(clientContext, strFileRelativeUrl).Stream;
                        clientContext.ExecuteQuery();
                        byte[] binary = ReadFully(fs);
                        FileStream stream = new FileStream(tempLocation + "\\" + fileName, System.IO.FileMode.Create);
                        BinaryWriter writer = new BinaryWriter(stream);
                        writer.Write(binary);
                        writer.Close();
                    }

                }
            }
            catch (Exception exec)
            {
                logger.WriteEventLog("Please contact admin : " + exec.Message);
                throw exec;
            }

        }

        public static byte[] ReadFully(Stream input)
        {

            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }

        public string CreateDirectory()
        {
            string fileDirectory = ConfigurationManager.AppSettings["FileLocation"];
            if (!Directory.Exists(fileDirectory))
            {
                Directory.CreateDirectory(fileDirectory);
            }       
            return fileDirectory;
        }
    }

Write Log File - C#

 class Logger
    {
        public void WriteEventLog(string errorMessage)
        {
            StringBuilder errorBuilder = new StringBuilder();
            try
            {

                if (!string.IsNullOrEmpty(errorMessage))
                {
                    string fileDateFormat = "yyyyMMdd";
                    string fileDirectory = ConfigurationManager.AppSettings["FileLocation"];
                    string errorLogFilePath = fileDirectory + "ErrorLog";

                    if (!Directory.Exists(errorLogFilePath))
                    {
                        Directory.CreateDirectory(errorLogFilePath);
                    }

                    errorLogFilePath = errorLogFilePath + @"\ErrorLogFile" + DateTime.Now.ToString(fileDateFormat) + ".log";
                    errorBuilder.Append("-------------------------------------------------------------------------------------------------\n");
                    errorBuilder.AppendLine(System.DateTime.Now.ToString());
                    errorBuilder.AppendLine("Error Message :" + errorMessage);
                    errorBuilder.AppendLine("-------------------------------------------------------------------------------------------------");

                    //Writing to Text File.
                    TextWriter oTW = System.IO.File.AppendText(errorLogFilePath);
                    oTW.WriteLine(errorBuilder.ToString());
                    oTW.Close();
                }

            }
            catch (Exception exec)
            {
                throw exec;
            }
        }   
    }