У меня есть этот HTML-код:
<div class="sfd">test</div>
<p dir="rtl" style="margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;"><span style="font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"> </span></p>
<p dir="rtl" style="font-family: David;font-size: 11pt;line-height: 115.0%;margin-top: 0;"><span style="font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"> </span></p>
<div class="sfd">test</div>
<p dir="rtl" style="font-family: David;font-size: 11pt;line-height: 115.0%;margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;"><span style="font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"> </span></p>
<p dir="rtl" style="font-family: David;font-size: 11pt;line-height: 115.0%;margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;"><span style="font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"> </span></p>
<div class="sfd">test</div>
<p dir="rtl" style="font-family: David;font-size: 11pt;line-height: 115.0%;margin-right: 0;margin-top: 0;"><span style="font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"> </span></p>
Я проанализировал его с:
XDocument xDoc = XDocument.Parse(html);
И я хочу удалить все пустые теги HTML рекурсивно, как это:
<div class="sfd">test</div>
<div class="sfd">test</div>
<div class="sfd">test</div>
Я попробовал с этим:
xDoc.Descendants()
.Where(e => !e.HasAttributes &&
string.IsNullOrEmpty(e.Value) &&
e.Descendants().All(f => String.IsNullOrEmpty(f.Value) && !f.HasAttributes))
.Remove();
Но ничего не делать
Tnx
2 ответа
Вы можете просто проверить Value
. Value
также будет пустым, когда есть дочерние узлы (которые пусты). Кроме того, вы проверяете атрибуты и не удаляете узлы, которые имеют атрибуты, но из вашего примера вы хотите удалить пустые теги с атрибутами.
string src = @"
<html><body>
<div class=""sfd"">test</div>
<p dir = ""rtl"" style=""margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;""><span style = ""font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"" > </span ></p >
<p dir=""rtl"" style=""font-family: David;font-size: 11pt;line-height: 115.0%;margin-top: 0;""><span style = ""font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"" > </span ></p >
<div class=""sfd"">test</div>
<p dir = ""rtl"" style=""font-family: David;font-size: 11pt;line-height: 115.0%;margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;""><span style = ""font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"" > </span ></p >
<p dir=""rtl"" style=""font-family: David;font-size: 11pt;line-height: 115.0%;margin-bottom: 0;margin-left: 0;margin-right: 0;margin-top: 0;""><span style = ""font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"" > </span ></p >
<div class=""sfd"">test</div>
<p dir = ""rtl"" style=""font-family: David;font-size: 11pt;line-height: 115.0%;margin-right: 0;margin-top: 0;""><span style = ""font-size: 11pt;font-style: normal;font-weight: normal;margin: 0;padding: 0;"" > </span ></p >
</body></html>
";
XDocument xDoc = XDocument.Parse(src);
xDoc.Descendants().Where(node => string.IsNullOrWhiteSpace(node.Value)).Remove();
MessageBox.Show(xDoc.ToString());
Чтобы сохранить <br/>
, просто исключите это явно. Заменить в приведенном выше коде:
xDoc.Descendants().Where(node => string.IsNullOrWhiteSpace(node.Value) && node.Name != "br").Remove();
Попробуйте использовать регулярные выражения для удаления, я думаю, это должно работать:
var result = Regex.Replace(html,"<[^/>].*></[^>]+>", "");
Похожие вопросы
Новые вопросы
c#
C# (произносится как «see Sharp») — это высокоуровневый мультипарадигменный язык программирования со статической типизацией, разработанный Microsoft. Код C# обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, которое включает в себя .NET, .NET Framework, .NET MAUI и Xamarin среди прочих. Используйте этот тег для ответов на вопросы о коде, написанном на C#, или о формальной спецификации C#.