Replace parameter in pubxml by using text file in c#

Viewed 94

I want to ask about replacing the parameter of publishUrl in the pubxml file. I use the stream reader and stream writer to complete the replacing process. This is the original file. I want to replace the parameter in the publishUrl.

<?xml version="1.0" encoding="utf-8"?>
<!--
This file is used by the publish/package process of your Web project. You can customize the behavior of this process
by editing this MSBuild file. In order to learn more about this please visit http://go.microsoft.com/fwlink/?LinkID=208121. 
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\Users\MX-15\Desktop\FB_DEMO\Test_SSIS\Test</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

First time execute the system will remove this line and nothing happen.

<?xml version="1.0" encoding="utf-8"?>

The second time execution the file has become like this. All sentence is stuck in one line.

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package
<PropertyGroup>C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package  
<WebPublishMethod>FileSystem</WebPublishMethod>
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package  
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package  
<LastUsedPlatform>Any CPU</LastUsedPlatform>
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package  
<SiteUrlToLaunchAfterPublish />
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package  
<ExcludeApp_Data>False</ExcludeApp_Data>
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package  
<publishUrl>C:\Users\MX-15\Desktop\FB_DEMO\Test_SSIS\Test</publishUrl>
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package  
<DeleteExistingFiles>True</DeleteExistingFiles>
C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package
</PropertyGroup>
</Project>

This is my coding

  try {
    string reader_path = param_pub;
    string writer_path = param_pub;

    using (System.IO.StreamReader sr = new System.IO.StreamReader(reader_path)) 
    {
       string read_line = sr.ReadToEnd();
       string[] lines = read_line.Split('\n');
       int count = lines.GetLength(0);
       sr.Close();

       string filePath = param_pub;
       if (File.Exists(filePath))
       {
         FileStream fs = new FileStream(filePath, FileMode.Truncate, FileAccess.Write);
         fs.Close();
       }

       StreamWriter sw = new StreamWriter(writer_path, true);

       int count_total_database_value = list.Count();
       ArrayList config_setting_array = new ArrayList();

      for (int j = 0; j < count_total_database_value; j++)
      {
        string config_setting_value = list[j].config_setting;
        config_setting_array.Add(config_setting_value);
      }

      for (int i = 0; i < count; i++)
      {
        if (i < count_total_database_value)
        {
          int split_param_end = lines[i].IndexOf('<');
          int split_param_start = lines[i].IndexOf('>', split_param_end + 1);
          string reader_param = lines[i].Substring(split_param_end + 1, split_param_start - (split_param_end + 1));
          for (int o = 0; o < count_total_database_value; o++)
          {
           string db_param = config_setting_array[i].ToString();
           if (split_param_start > 0 || split_param_end > 0)
           {
             reader_param = lines[i].Substring(split_param_end + 1, split_param_start - (split_param_end + 1));

             int split_value_start = lines[i].IndexOf('>', split_param_start + 1);
             int split_value_end = lines[i].IndexOf('<', split_value_start + 1);
             string reader_param_value;

             if (split_value_start > 0 || split_value_end > 0)
             {

               reader_param_value = lines[i].Substring(split_value_start + 1, split_value_end - (split_value_start + 1));

               sw.Write(lines[i].ToString().Replace(reader_param_value, list[o].value));
            }
            else
            {
              continue;
            }
           }
          }
         }
         else
         {
          sw.Write(lines[i].ToString());
         }
        }
        sw.Close();
       }

The list is stored the key and parameter value.

1 Answers

Here is an example. a C#/.Net Core console app, using System.Xml:

  1. Load the file into an XmlDocument,
  2. Do an XPath search for your publishUrl element,
  3. Change the value, and
  4. Write out the updated .xml file.

example.xml:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
    <LastUsedPlatform>Any CPU</LastUsedPlatform>
    <SiteUrlToLaunchAfterPublish />
    <ExcludeApp_Data>False</ExcludeApp_Data>
    <publishUrl>C:\Users\MX-15\Desktop\FB_DEMO\Test_SSIS\Test</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

Program.cs:

using System;
using System.IO;
using System.Xml;

namespace ConsoleApp1
{
    /**
     * REFERENCE:
     * https://docs.microsoft.com/en-us/dotnet/api/system.xml.xmldocument?view=netcore-3.1
     * https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/linq-to-xml-overview
     */
    class Program
    {
        static readonly string FILENAME = "example.xml";

        static void Main(string[] args)
        {
            // Read XML file
            XmlDocument exampleData = new XmlDocument();
            exampleData.Load(FILENAME);

            // Use XmlNamespaceManager
            var nsmgr = new XmlNamespaceManager(exampleData.NameTable);
            nsmgr.AddNamespace("msb", "http://schemas.microsoft.com/developer/msbuild/2003");

            // Perform update
            string newValue = @"C:\Users\MX-15\Desktop\FYP_DEMO\Publish_Package";
            XmlNode elementToChange = exampleData.SelectSingleNode("//msb:publishUrl", nsmgr);
            if (elementToChange == null)
            {
                Console.WriteLine("ERROR: Element not found!");
                return;
            }
            elementToChange.InnerText = newValue;

            // Write modified file
            exampleData.Save(FILENAME);
        }
    }
}
Related