我需要删除这些内容之间的所有内容。
我尝试过使用此
newLines = RemoveLines(newLines, "<!-- ENHANCED -->", "<!-- /ENHANCED -->", true);
private static List<string> RemoveLines(List<string> newLines, string startingLine, string endingLine, bool removeContents)
{
for (var i = 0; i < newLines.Count(); i++)
{
if (newLines[i].Trim() != startingLine.Trim()) continue;
newLines.RemoveAt(i);
if (removeContents)
for (var j = i; newLines[j].Trim() != endingLine.Trim(); j++)
{
newLines.RemoveAt(j);
j--;
}
newLines.RemoveAt(i);
}
return newLines;
}
但是当两个字符串出现在同一行时,这不起作用。
我也尝试过使用xdocument。
var xdoc = XDocument.Load(file, LoadOptions.PreserveWhitespace);
var nodes = xdoc.DescendantNodes();
var newNodes = RemoveNodes(nodes, "<!-- ENHANCED -->", "<!-- /ENHANCED -->", true);
var doc = new XDocument(newNodes);
doc.Save(file);
private static IEnumerable<XNode> RemoveNodes(IEnumerable<XNode> nodes, string startingNode, string endingNode, bool removeBetweenNodes)
{
var xNodes = nodes as IList<XNode> ?? nodes.ToList();
for (var i = 0; i < xNodes.Count(); i++)
{
if (xNodes[i].ToString().Trim() != startingNode.Trim()) continue;
xNodes.RemoveAt(i);
if (removeBetweenNodes)
for (var j = i; xNodes[j].ToString().Trim() != endingNode.Trim(); j++)
{
xNodes.RemoveAt(j);
j--;
}
xNodes.RemoveAt(i);
}
return (IEnumerable<XNode>) xNodes;
}
由于文件夹中缺少某些引用的.dtd文件,因此失败。
这可以通过读取流然后应用正则表达式来完成。我不擅长正则表达式。有人可以帮忙吗?
答案 0 :(得分:0)
试试这个
//var content = @"
// header
// <!-- ENHANCED --> details <!-- /ENHANCED -->
// trailler
//
// |
//
// first
// <!-- ENHANCED -->
// second
// <!-- /ENHANCED -->
// third";
var content = File.ReadAllText("file.xml");
Console.WriteLine(Regex.Replace(content,
@"<!-- ENHANCED -->[\s\S]*?<!-- /ENHANCED -->", ""));
在XML文件中,序列<!-- ... -->
定义了注释。
为避免在尝试将它们与XPath匹配时遇到困难,此正则表达式将通过将该XML文件视为纯文本来删除两个序列之间的任何内容。
您需要确保替换不会破坏您的XML文档。