Найти слово в строке и заменить его - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть строка [XML], я хочу найти теги, содержащие слово, и заменить этот тег другим именем.

Я пытался использовать это, но безуспешно:

var regex = new Regex(@"\bKeyValueOfstringOutcome\b", RegexOptions.IgnoreCase);
string result = regex.Replace(xml.Document.ToString(), "");

Это мой XML:

<Response>
  <Outcome>
    <KeyValueOfstringOutcomeTest1>
      <Key>Icon</Key>
      <Value>
        <DataType>System.String</DataType>
        <Field>Icon</Field>
        <Value>O</Value>
      </Value>
    </KeyValueOfstringOutcomeTest1>
    <KeyValueOfstringOutcomeTest2>
      <Key>IconDescription</Key>
      <Value>
        <DataType>System.String</DataType>
        <Field>IconDescription</Field>
        <Value>Old</Value>
      </Value>
    </KeyValueOfstringOutcomeTest2>
    <KeyValueOfstringOutcomeTest3>
      <Key>IconLongDescription</Key>
      <Value>
        <DataType>System.String</DataType>
        <Field>IconLongDescription</Field>
        <Value>Older</Value>
      </Value>
    </KeyValueOfstringOutcomeTest3>
  </Outcome>
</Response>

Мне нужно найти узлы, которые содержат KeyValueOfstringOutcome, и заменить KeyValueOfstringOutcomeTest1, KeyValueOfstringOutcomeTest2, KeyValueOfstringOutcomeTest3 на KeyValueOfstringOutcome.

Ответы [ 5 ]

0 голосов
/ 01 апреля 2019

Это то, что я сделал для достижения этой цели.

var match = Regex.Match(xml.Document.ToString(), @"KeyValueOfstringOutcome.*>");
                if (match.Success)
                {
                    var replacedText = Regex.Replace(xml.Document.ToString(), @"KeyValueOfstringOutcome.*>", "KeyValueOfstringOutcome>");
                }
0 голосов
/ 01 апреля 2019

Использовать xml linq:

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

namespace ConsoleApplication107
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> keyValueOfstringOutcomeTests = doc.Descendants().Where(x => x.Name.LocalName.StartsWith("KeyValueOfstringOutcomeTest")).ToList();
            foreach (XElement keyValueOfstringOutcomeTest in keyValueOfstringOutcomeTests)
            {
                keyValueOfstringOutcomeTest.ReplaceWith(new XElement("KeyValueOfstringOutcomeTest", keyValueOfstringOutcomeTest.Elements()));
            }
        }
    }
}
0 голосов
/ 01 апреля 2019

Если я вас правильно понял, что вы хотите избавиться от Test1, Test2 и так далее. Я бы предложил использовать этот Заменить метод.

string replacedXML = Regex.Replace(xml.Document.ToString(),
                                   @"KeyValueOfstringOutcomeTest\d+",
                                    "KeyValueOfstringOutcome");

\d+ будет соответствовать 1 или более вхождений цифры за вашим ключевым словом

0 голосов
/ 01 апреля 2019

Я бы не использовал REGEX для сопоставления и изменения имени узлов. Если вы когда-нибудь обновите свой файл или наименования, это может привести к сбою или изменению какого-либо другого узла, который также содержит модное слово.

Так что я бы создал цикл для каждого childnode на уровне / иерархии, который вы хотите изменить, а затем захватил бы и переименовал его.

foreach (XmlNode node in doc.ChildNodes)
{        
    // [2] should be the the deepth of childenotes named `KeyValueOfstringOutcomeTestX`
    node.ChildNode[2].Name = "YOUR NEW NAME TO THIS NODE";  
}
doc.Save();  // Change renamed nodes to the document.
0 голосов
/ 01 апреля 2019

Попробуйте, если это поможет.

string result = Regex.Replace(xml.Document.ToString(), "[a-zA-Z0-9]*KeyValueOfstringOutcome[a-zA-Z0-9]*","KeyValueOfstringOutcome");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...