Как найти и заменить часть текста CDATA. c# - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь написать программу, которая может конвертировать некоторые файлы PL C с физических контроллеров в эмуляторы, поэтому я экспортировал файл XML, где я не хочу находить все вхождения ": I" и заменять их с "_I" текст, который я не хочу менять, находится внутри CDATA. Пожалуйста, проверьте экзамен

    <Routines>
      <Routine Name="Aggregate_calls" Type="ST">
        <STContent>
          <Line Number="0"><![CDATA[/* Aggregate_Calls: Processing of Type Circuits]]></Line>
          ...(A lot of Lines/data here.)
          <Line Number="312"><![CDATA[_1000017_Data_In.ConnectionFaulted := VFD_1000017:I1.ConnectionFaulted;]]></Line>

Код, который я уже написал, таков:

 static void Main(string[] args)
    {
        Console.WriteLine(@"Insert full path of the XML files. ex. C:\Users\ECR\Desktop");

        var folder = Console.ReadLine()+@"\";

        string[] files = System.IO.Directory.GetFiles(folder, "*.L5X");

        foreach (var CLX in files)
        {                
            var xDoc = XDocument.Load(CLX); //XDocument.Load(filename)

            foreach (var CPU in xDoc.Descendants().Elements("Controller"))
            {
                CPU.Attribute("ProcessorType").Value = "Emulate 5570";

                var attribute = new XAttribute("TimeSlice", 20);
                CPU.Add(attribute);
            }


            //  I WAN'T TO INSERT THE CODE HERE.


            var moduleList = xDoc.Descendants("Modules").Elements().ToList();

            foreach (var module in moduleList)
            {
                module.Remove();
            }

            var xDocEmu = XDocument.Load("EmuBaseObject.L5X"); //XDocument.Load(filename)

            var moduleListEmu = xDocEmu.Descendants("Modules").Elements().ToList();


            xDoc.Descendants("Modules").Single().Add(moduleListEmu[0]);

            var filename = Path.GetFileName(CLX);

            var date = DateTime.Now.ToString("yyyy.MM.dd - HH.mm");

            var outputfolder = folder + @"\Emulate Files\" + date;

            System.IO.Directory.CreateDirectory(outputfolder);

            xDoc.Save(outputfolder + @"\" + filename);

            Process.Start(outputfolder);
        }
    }

Все функции, которые я добавил в этот код, все еще должны работать.

1 Ответ

0 голосов
/ 16 января 2020

В зависимости от пути к узлам, которые вы хотите изменить, мне это удастся.

 var cdata = xDoc.Element("Routines").Descendants("Routine").Descendants("STContent").Descendants().Where(_ => _.FirstNode.NodeType == System.Xml.XmlNodeType.CDATA).ToList();

 cdata.ForEach(_ => _.Value = _.Value.Replace(":I", "_I"));

Дайте мне знать, если вам нужны дальнейшие объяснения.

...