Убрать комментарии из XML - PullRequest
3 голосов
/ 28 декабря 2008

Я столкнулся с необходимостью удаления комментариев из формы:

<!--  Foo

      Bar  -->

Я бы хотел использовать регулярное выражение, которое соответствует чему угодно (включая разрывы строк) между начальным и конечным разделителями.

Каким будет хорошее регулярное выражение для этой задачи?

Ответы [ 5 ]

6 голосов
/ 28 декабря 2008

NONE. Он не может быть описан контекстно-свободной грамматикой, на которой основано регулярное выражение.

Допустим, этот поток экспортируется в XML. Ваш пример (<! - FOO Bar ->), если он включен в CDATA, будет утерян, но это не совсем комментарий.

5 голосов
/ 28 декабря 2008

Простой способ:

Regex xmlCommentsRegex = new Regex("<!--.*?-->", RegexOptions.Singleline | RegexOptions.Compiled);

И лучший способ:

Regex xmlCommentsRegex = new Regex("<!--(?:[^-]|-(?!->))*-->", RegexOptions.Singleline | RegexOptions.Compiled);
4 голосов
/ 28 декабря 2008

«Правильный» способ - использовать XSLT и копировать все, кроме комментариев.

0 голосов
/ 08 ноября 2013

Вот полный пример кода для чтения XML-файла и возврата строки, которая является файлом без комментариев.

var text = File.ReadAllText("c:\file.xml");
{ 
  const string strRegex = @"<!--(?:[^-]|-(?!->))*-->";
  const RegexOptions myRegexOptions = RegexOptions.Multiline;
  Regex myRegex = new Regex(strRegex, myRegexOptions);
  string strTargetString = text;
  const string strReplace = @""; 

  string result = myRegex.Replace(strTargetString, strReplace);
  return result;
}

К сожалению, RegexOptions.Multiline сам по себе не справится (что немного нелогично).

0 голосов
/ 28 декабря 2008

Синтаксический анализ XML с помощью регулярных выражений считается плохим стилем. Используйте некоторую библиотеку разбора XML.

...