Удаление незакрытых открывающих тегов <p>из документа xhtml - PullRequest
5 голосов
/ 07 сентября 2010

У меня большой xhtml-документ с большим количеством тегов.Я заметил, что несколько открытых тегов открывающих абзацев повторяются без необходимости, и я хочу удалить их или заменить их пробелом.я просто хочу написать код, чтобы идентифицировать закрытые теги абзаца и удалить их.

Вот небольшой пример, чтобы показать, что я имею в виду:

<p><strong>Company Registration No.1</strong> </p>
<p><strong>Company Registration No.2</strong></p>

<p>      <!-- extra tag -->
<p>      <!-- extra tag -->

<hr/>     

<p><strong> HALL WOOD (LEEDS) LIMITED</strong><br/></p>
<p><strong>REPORT AND FINANCIAL STATEMENTS </strong></p>

Может кто-нибудь дать мне код для консольного приложения,просто чтобы удалить эти незакрытые теги абзаца.

Ответы [ 2 ]

3 голосов
/ 07 сентября 2010

это должно работать:

public static class XHTMLCleanerUpperThingy
{
    private const string p = "<p>";
    private const string closingp = "</p>";

    public static string CleanUpXHTML(string xhtml)
    {
        StringBuilder builder = new StringBuilder(xhtml);
        for (int idx = 0; idx < xhtml.Length; idx++)
        {
            int current;
            if ((current = xhtml.IndexOf(p, idx)) != -1)
            {
                int idxofnext = xhtml.IndexOf(p, current + p.Length);
                int idxofclose = xhtml.IndexOf(closingp, current);

                // if there is a next <p> tag
                if (idxofnext > 0)
                {
                    // if the next closing tag is farther than the next <p> tag
                    if (idxofnext < idxofclose)
                    {
                        for (int j = 0; j < p.Length; j++)
                        {
                            builder[current + j] = ' ';
                        }
                    }
                }
                // if there is not a final closing tag
                else if (idxofclose < 0)
                {
                    for (int j = 0; j < p.Length; j++)
                    {
                        builder[current + j] = ' ';
                    }
                }
            }
        }

        return builder.ToString();
    }
}

Я протестировал его на вашем примере, и он работает ... хотя это плохая формула для алгоритма, он должен дать вам начальную основу!

2 голосов
/ 07 сентября 2010

Вы должны выяснить, какое DOM-дерево создано.Его можно интерпретировать как

<p><strong>Company Registration No.1</strong> </p>
<p><strong>Company Registration No.2</strong></p>

<p>      <!-- extra tag -->
  <p>      <!-- extra tag -->
    <hr/>     
    <p><strong> HALL WOOD (LEEDS) LIMITED</strong><br/></p>
    <p><strong>REPORT AND FINANCIAL STATEMENTS </strong></p>
  </p>
</p>

или

<p><strong>Company Registration No.1</strong> </p>
<p><strong>Company Registration No.2</strong></p>

<p></p>      <!-- extra tag -->
<p></p>      <!-- extra tag -->
<hr/>     
<p><strong> HALL WOOD (LEEDS) LIMITED</strong><br/></p>
<p><strong>REPORT AND FINANCIAL STATEMENTS </strong></p>

. Вы можете попытаться найти вложенные p-теги, переместить внутреннее содержимое во внешний p-тег и удалить внутренний p-тег.тег, который оставлен пустым.В любом случае, я считаю, что вам нужно сначала проанализировать DOM-дерево.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...