C#如何根据搜索到的字符串修改xml属性

本文关键字:字符串 修改 xml 属性 何根 搜索 | 更新日期: 2023-09-27 18:27:53

我想找到包含特定字符串的元素属性的所有实例并对其进行更改。

示例xml为:

<system>
  <template>
    <url address="http://localhost:7888/Application/basic" />
    <url address="http://localhost:7997/sdk/basic" />
    <url address="http://localhost:5855/htm/ws" />
    <url address="net.tcp://localhost:5256/htm" />
    <url address="http://localhost:5215/htm/basic" />
    <url address="http://localhost:5235/htm/ws" />
    <url address="net.tcp://localhost:5256/htm" />
    <url address="http://localhost:5252/Projectappmgr/basic"/>
    <url address="http://localhost:5295/Projectappmgr/ws" />
  </template>
</system>

我有以下代码:

XmlNodeList nodelist = doc.GetElementsByTagName("url");
foreach (XmlNode node in nodelist)
{
    if (node.Attributes["address"].Value.Contains("localhost"))
    {
        string origValue = node.Attributes["address"].Value;
        string modValue = String.Empty;
        Console.WriteLine("Value of original address is: " + origValue);
        modValue = origValue.Replace("localhost", "newURLName");
        Console.WriteLine("Value of modified address is: " + modValue);
        node.Attributes["address"].InnerText = modValue;
    }
}

这将按预期修改地址的值。

<url address="http://newURLName:7888/Application/basic" />

但是,我真正想要的是用newURLName替换整个字符串"localhost:7788"。有没有办法将端口号指定为通配符,因为它们不会都与示例xml块中的相同?

我知道我需要替换值为"localhost:xxxx",但每个实例中的"xxxx"都不同,我现在有点像是在留白。

感谢

C#如何根据搜索到的字符串修改xml属性

正则表达式在这里应该有所帮助:

  modValue = Regex.Replace(url, @"localhost(:'d+){0,1}", newUrlName)

在这里你可以找到更多的考试。此外,我建议使用Expresso来熟悉Regex。

您可以使用xpath查找包含搜索字符串的节点,然后使用UriBuilder类修改您的URL:

var xdoc = XDocument.Parse(xml);
var nodes = xdoc.XPathSelectElements("//url[contains(@address, 'localhost')]");
foreach (var node in nodes)
{
    var ub = new UriBuilder(node.Attribute("address").Value);
    ub.Host = "newURLName";
    node.SetAttributeValue("address", ub.ToString());
}

这会给你

<system>
  <template>
    <url address="http://newURLName:7888/Application/basic" />
    <url address="http://newURLName:7997/sdk/basic" />
    <url address="http://newURLName:5855/htm/ws" />
    <url address="net.tcp://newURLName:5256/htm" />
    <url address="http://newURLName:5215/htm/basic" />
    <url address="http://newURLName:5235/htm/ws" />
    <url address="net.tcp://newURLName:5256/htm" />
    <url address="http://newURLName:5252/Projectappmgr/basic" />
    <url address="http://newURLName:5295/Projectappmgr/ws" />
  </template>
</system>

从您的XML示例中,即使不使用regex。

更换

modValue = origValue.Replace("localhost", "newURLName");

通过

modValue = Regex.Replace(origValue, "localhost(:[0-9]+){0,1}", "newURLName");

regex的替代方案是使用强类型的Uri对象和UriBuilder。

var origValue = new Uri(node.Attributes["address"].Value);
var uriBuilder = new UriBuilder(origValue);
uriBuilder.Host = newHost;
uriBuilder.Port = newPort;
modValue = uriBuilder.Uri;

这可能看起来很冗长,但它是简单regex的替代方案,为您提供了强类型的内容,并允许您验证Uri是否实际有效(请参阅Uri类方法/属性)。你也可以一步完成主机和端口号,我还没有玩过。