2015-09-24 2 views
0

Мне нужно удалить все содержимое между этими 2 и включая их.Как удалить содержимое из двух строк из документа 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; 
    } 

, но это не работает Whe появляются обе строки в одной строке.

Я также попытался использовать 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

Не забудьте добавить его в свой вопрос? –

ответ

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-документ.

Смежные вопросы