У меня есть строка ниже (которая изначально была XML):
<Message><ProcedureName>TestUpdate</ProcedureName><Parameters><![CDATA[N'Yes',N'No']]></Parameters><MessageType>A</MessageType></Message>
Я пробовал следующее, но текст «Нет» является динамическим (это может быть другое значение):
message.Replace("No", "********");
Я не уверен, могу ли я сделать это с помощью string.Replace, Регулярное выражение или их комбинации?





Вы можете использовать регулярное выражение, чтобы получить строку между двумя тегами перед заменой:
string str = "<Message><ProcedureName>TestUpdate</ProcedureName><Parameters><![CDATA[N'Yes',N'No']]></Parameters><MessageType>A</MessageType></Message>";
Match match = Regex.Match(str, @"CDATA\[.*\]");
if (match.Success)
{
Console.WriteLine(str_out);//"CDATA[N'Yes', N'No']]"
}
Предполагая, что под словом «динамический» вы имеете в виду, это может быть что угодно, включая «Нет», вот моя попытка:
var source = "<Message><ProcedureName>TestUpdate</ProcedureName><Parameters><![CDATA[N'Yes',N'No']]></Parameters><MessageType>A</MessageType></Message>";
var regexstr = @"(.*\[CDATA\[.*,N')(.*)('\]\].*)";
var regex = new Regex(regexstr);
var matches = regex.Match(source);
Console.WriteLine($"{matches.Groups[1].Value}****{matches.Groups[3].Value}");
//Console Output: <Message><ProcedureName>TestUpdate</ProcedureName><Parameters><![CDATA[N'Yes',N'****']]></Parameters><MessageType>A</MessageType></Message>
Возможно, это можно было бы дополнительно оптимизировать, но это зависит от вашего источника. Надеюсь, поможет!
Это то, на чем я остановился. Он не идеален, но удовлетворяет моим требованиям.
Match match = Regex.Match(message, @"CDATA\[.*\]");
if (match.Success)
{
maskedMessage = message.Replace(match.Value, "********");
}
Это полностью заменяет то, что находится в <Parameters> - ну, почти, оставляет недопустимую разметку. Если вы хотите стереть весь элемент, а не строки внутри него, вам гораздо лучше обработать эту строку как фактический XML (m = XElement.Parse(...); m.Element("Parameters").Value = "*****";). Этот CDATA используется в Parameters, и только там, вероятно, не то, на что вам следует полагаться.
XML уже был отправлен в команду T-SQL, прежде чем я добрался до этого кода. Этот код предназначен исключительно для добавления записи журнала в текстовый файл.
Похоже, это списки параметров, передаваемые команде T-SQL. Если это так, имейте в виду, что само значение может содержать экранированные одинарные кавычки (
N'He said ''Yes''.'), и ваша логика замены должна это учитывать.