如何从xml文档中删除2个字符串之间的内容

时间:2015-09-24 16:36:28

标签: c# xml

我需要删除这些内容之间的所有内容。

我尝试过使用此

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文件,因此失败。

这可以通过读取流然后应用正则表达式来完成。我不擅长正则表达式。有人可以帮忙吗?

1 个答案:

答案 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文档。