Intereting Posts
Запуск и остановка локального экземпляра mysql из приложения Как закрыть TextInputPanel DependencyProperty как переменные экземпляра? Экспорт данных gridview в excel в asp.net Логика за методом Array.Reverse () C # – Что такое некоторые лучшие рекомендации / советы для ADO.NET Как получить список локальных групп компьютеров / пользователей, когда машина не находится в активной директории? Преобразование double в строку с N десятичными знаками, точкой в ​​виде десятичного разделителя и без разделителя тысяч Thread safe StreamWriter C # как это сделать? 2 Существует ли более эффективный способ работы с API рекламы продукта Amazon на C # ASP.NET (esp MVC 5)? Прочитайте содержимое ActiveCell в Excel с помощью VSTO Почему форматирование DateTime как строки обрезается, а не округляет миллисекунды? Каков правильный способ сравнения символов, игнорирующих случай? EF 4.1 и «Коллекция была изменена; операция enums не может выполняться. “exception IP-камера останавливает stream через некоторое время

Как удалить тег href с CDATA

У меня есть следующий CDATA внутри документа xml:

<![CDATA[ 

Refer to the below:

Basic offers...
Faster network
  • Session
capabilities
  • Navigation,
  • message, and
  • contacts
Data

Here visit google for more info www.google.com.

Remove this href tag Information remove the tag.


]]>

Я хочу, чтобы какой-то способ проверки href = “/ abc / def и удалить тег href, который начинается с abc / def. В приведенном выше примере удалите тег href и просто оставьте текст« Информация »внутри тега. CDATA может иметь более одного href с надписью «abc / def …». Я использую C # для этого приложения. Может кто-то, пожалуйста, помогите мне и скажите, как это можно сделать? Должен ли я использовать регулярное выражение или есть способ сделать это с помощью xml?

Это регулярное выражение, которое я пытаюсь:

 "" 

Я хочу, чтобы внутренний текст тега href просто удалял tags. Но над regex не работает.

Использование HtmlAgilityPack

 HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(html); var nodes = doc.DocumentNode .Descendants("a") .Where(n => n.Attributes.Any(a => a.Name == "href" && a.Value.StartsWith("/abc/def"))) .ToArray(); foreach(var node in nodes) { node.ParentNode.RemoveChild(node,true); } var newHtml = doc.DocumentNode.InnerHtml; 

Я бы использовал HtmlAgilityPack для этой задачи. Сама задача довольно проста: выбрать узлы с помощью xpath, а затем удалить их. Остается только получить результат HTML:

Это библиотека .NET-кода, которая позволяет анализировать HTML-файлы вне Интернета. Парсер очень толерантен с искаженным HTML-кодом «реального мира». Объектная модель очень похожа на то, что предлагает System.Xml, но для HTML-документов (или streamов).

 var doc = new HtmlDocument(); doc.LoadHtml(xml); var anchors = doc.DocumentNode.SelectNodes("//a[starts-with(@href, '/abc/def')]"); foreach (var anchor in anchors.ToList()) anchor.Remove(); var result= doc.DocumentNode.OuterHtml; 

Это даст вам именно то, что вы хотите.

РЕДАКТИРОВАТЬ:

Если вы хотите удалить только атрибут href , измените эту anchor.Remove() строки. anchor.Remove() к этому одному anchor.Attributes["href"].Remove();

Если HTML – хорошо сформированный XML (который с первого взгляда выглядит так), вы можете загрузить текст узла cdata в новый XML-документ, в случае необходимости изменить XML, а затем заменить текст исходного узла cdata на XML текст вашего измененного документа.

Поскольку cdata по определению не разбирается в исходном документе XML, поэтому вам понадобится вторичный.

Примечание. Я не рекомендую запускать это Regex во всей строке XML, так как большинство соглашается, что это плохо. Следующее регулярное выражение может и должно выполняться на отдельных узлах документа во время правильного обхода. Решение было опубликовано как единственная замена регулярного выражения на всей xmlString, поскольку это было запрошено пользователем, и у них возникли проблемы с адаптацией выражения регулярного выражения к их конкретной ситуации – я написал символ кода по символу, чтобы соответствовать тому, как они намеревались использовать это как можно ближе.


Чтобы удалить все tags href где URL начинается с /abc/def/ , вам лучше использовать регулярное выражение:

 result = Regex.Replace(xmlString, @"(.*)", "$1"); 

Слежение за комментариями ниже

Согласно MSDN :

В пределах указанной входной строки заменяет все строки, соответствующие указанному регулярному выражению, указанной строкой замены.

Эта замена будет происходить во всех случаях, а не только в первой. Если остальные не работают, это потому, что в них есть что-то другое, что не соответствует регулярному выражению.

Например, если в некоторых случаях есть дополнительные пробелы между a и href, или целевое поле указано перед полем href, вам нужно будет использовать кого-то менее конкретную замену:

 result = Regex.Replace(str, @"(.*)", "$1");