У меня есть этот 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

-1
kfir 15 Авг 2019 в 12:15

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();
1
NineBerry 15 Авг 2019 в 10:10

Попробуйте использовать регулярные выражения для удаления, я думаю, это должно работать:

var result = Regex.Replace(html,"<[^/>].*></[^>]+>", "");
0
andyb952 15 Авг 2019 в 09:57