如何查找和替换部分 CDATA 文本。 C#
How to find and replace part of CDATA text. c#
我正在尝试编写一个程序,可以将一些 PLC 文件从物理控制器转换为仿真器,因此我导出了一个 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);
}
}
我在这段代码中添加的所有功能仍然需要工作。
根据您要更改的节点路径,这对我有用。
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"));
如果您需要进一步解释,请告诉我。
我正在尝试编写一个程序,可以将一些 PLC 文件从物理控制器转换为仿真器,因此我导出了一个 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);
}
}
我在这段代码中添加的所有功能仍然需要工作。
根据您要更改的节点路径,这对我有用。
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"));
如果您需要进一步解释,请告诉我。