首页 > 解决方案 > 如何在 C# 应用程序中匹配设置文件的 xml 节点

问题描述

我的 C# 代码如下。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="ICTRExchange.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>
  <userSettings>
    <ICTRExchange.Properties.Settings>
      <setting name="ServerIP" serializeAs="String">
        <value />
      </setting>
      <setting name="ServerPort" serializeAs="String">
        <value>0</value>
      </setting>

如何在 C# 中使用正则表达式进行匹配。我在下面尝试正则表达式。但这不是正确的操作。

例子

我的目标节点是"ServerPort"

var regex = new Regex("<setting name=\"ServerPort\"(.*?)</setting>");
regex.match(xmlstring)

标签: c#regex

解决方案


使用正则表达式解析标记语言是一个非常糟糕的主意(请参阅:使用正则表达式解析 HTML:为什么不呢? -它是关于 HTML,但也适用于 XML)。

相反,您可以使用 .NET 中提供的 XML 库,例如System.Xml.

这是您可以构建应用程序的代码片段(我将您的 XML 存储在testxml.xml文件中):

static void Main(string[] args)
{
  XmlDocument xml = new XmlDocument();
  xml.Load(@"C:/users/MyUser/desktop/testxml.xml");
  var settings = xml.SelectNodes("configuration/userSettings/ICTRExchange.Properties.Settings")[0].ChildNodes;
  XmlNode settingsWithServerPort = null;
  foreach (XmlNode node in settings)
    if (node.Attributes["name"].Value == "ServerPort")
      settingsWithServerPort = node;
}

推荐阅读