如何在安装软件的多个文件夹中更新每个 xml 配置文件的 IP 地址

Posted

技术标签:

【中文标题】如何在安装软件的多个文件夹中更新每个 xml 配置文件的 IP 地址【英文标题】:How to go update every xml config file's IP Address in multiple folders where software was installed 【发布时间】:2020-04-07 22:45:40 【问题描述】:

我有一个软件,它在安装时会询问我服务器的 IP 地址,并将该地址存储到不同文件夹中的多个配置文件中。我拥有的这段代码在一个配置文件中更新了配置文件的端点地址。

我将如何修改代码以查看软件的安装位置并更新安装软件的不同文件夹内的所有配置文件中的所有 IP 地址。

所有带有 IP 地址的配置文件看起来有点像我的示例。

配置文件

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;


namespace ConfigTool

    class Class1
    
    //    foreach (Environment.SpecialFolder folder_type in Enum.GetValues(typeof(Environment.SpecialFolder)))
    //    
    //        DescribeFolder(folder_type);
    //    
    //txtFolders.Select(0, 0);
    //const string FILENAME = Environment.GetFolderPath(Environment.SpecialFolder.);
        const string FILENAME = @"C:\Program Files (x86)\******\***\***\*****\*****.****.****.exe.config";
        public static IPAddress GetIPAddress(string hostName)
        
            Ping ping = new Ping();
            var replay = ping.Send(hostName);

            if (replay.Status == IPStatus.Success)
            
                return replay.Address;
            
            return null;
        

        static void Main(string[] args)
        
            XDocument doc =  XDocument.Load(FILENAME);
                List<XElement> endpoints = doc.Descendants("endpoint").ToList();
                foreach (var endpoint in endpoints )
                
                    string address = (string)endpoint.Attribute("address");
                    string newIp = "10.249.30.4";

                    string pattern = "//[^:]+";
                    address = Regex.Replace(address, pattern, "//" + newIp);

                    endpoint.Attribute("address").SetValue(address);
                
            doc.Save(

XMLExample

<endpoint name="***Local" address="net.tcp://10.249.30.4:7732/EventSubscriberServices/Secure" binding="netTcpBinding" contract="****.Services.ServiceContracts.ISubscriptionService" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="CustomValidator">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>
      <endpoint name="***Local" address="net.tcp://10.243.32.4:7732/EventPublishServices/Secure" binding="netTcpBinding" contract="****.Services.ServiceContracts.IPublishService" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="CustomValidator">
        <identity>
          <dns value="*******" />
        </identity>
      </endpoint>
      <endpoint name="****" address="net.tcp://10.243.32.4:7732/AuthenticationServices/Secure" binding="netTcpBinding" contract="****.Services.ServiceContracts.IAuthenticationService" bindingConfiguration="TcpCustomSecurity" behaviorConfiguration="CustomValidator">
        <identity>
          <dns value="localhost" />
        </identity>
      </endpoint>

【问题讨论】:

那么您的具体问题是什么?你在这方面有什么困难? "如何修改代码以查看软件的安装位置,并更新安装软件的不同文件夹中所有配置文件中的所有 IP 地址。" 这个问题太宽泛了。您的问题是关于查找文件还是更新 XML?同样,您的具体问题是什么?将您想做的事情分解为任务,然后开始执行其中一项任务。第一个可能是定位文件。让它工作。然后开始研究如何更新它们。当您为第一个任务编写代码并遇到困难时,您可以就该特定代码寻求帮助。 我注释掉的代码是为任务写的代码。我试图创建一个 Environment.SpecialFolder 以查看软件的安装位置并通过该目录中的 xml 配置运行,但我不熟悉 Environment.Special 方法。我希望有人能指出我正确的方向 您注释掉的代码不是问题。如果您的问题与使用 Environment.SpecialFolder 功能有关,请对其进行编辑以询问该主题。如果您在此处需要帮助,您需要在帖子中提出具体问题。我已经要求您这样做了两次,但您仍然没有在您的帖子中发送edit 以澄清您所要求的具体是什么。 (顺便说一句,你不能只是不断地输入通配符 * 并希望它做某事,因为它不会。文件路径通配符必须是有效的。) 【参考方案1】:

使用 Xml Linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            XDocument doc = XDocument.Load(FILENAME);

            List<EndPoint> endPoints = doc.Descendants("endpoint").Select(x => new EndPoint()
            
                name = (string)x.Attribute("name"),
                address = (string)x.Attribute("address"),
                binding = (string)x.Attribute("binding"),
                contract = (string)x.Attribute("contract"),
                bindingConfiguration = (string)x.Attribute("bindingConfiguration"),
                behaviorConfiguration = (string)x.Attribute("behaviorConfiguration"),
                dns = (string)x.Descendants("dns").FirstOrDefault().Attribute("value"),

            ).ToList();
        
    
    public class EndPoint
    
        public string name  get; set; 
        public string address  get; set; 
        public string binding  get; set; 
        public string contract  get; set; 
        public string bindingConfiguration  get; set; 
        public string behaviorConfiguration  get; set; 
        public string dns  get; set; 
    

【讨论】:

以上是关于如何在安装软件的多个文件夹中更新每个 xml 配置文件的 IP 地址的主要内容,如果未能解决你的问题,请参考以下文章

Linux下安装多个tomcat

在Centos6.6中如何配置软件下载更新源地址

紧急求助:如何在Debian下安装更新软件包

struts2中配置多个struts.xml配置文件

linux加载配置文件命令是啥

如何在hibernate.cfg.xml中的主配置文件中配置多个映射文件