Используя C #, как я могу вручную проверить HTML-тег? - PullRequest
1 голос
/ 08 октября 2010

У меня есть, например, этот тег изображения:

<img src="http://... .jpg" al="myImage" hhh="aaa" />

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

L1=(alt, src, width, height, align, border, hspace, longdesc, vpace)

Я анализирую тег img и получаю используемые атрибуты, подобные этому:

L2=(src, al, hhh)

Как я могу программно проверить тег изображения? Так что атрибут 'al' должен стать 'alt' (атрибут 'alt' больше похож на атрибут 'align', который содержит гораздо больше символов), а тег 'hhh' исчезнет (потому что нет атрибута, который будет похож на него)?

Для результата тег должен выглядеть так:

<img src="http://... .jpg" alt="myImage" />

Спасибо.

Jeff

Ответы [ 2 ]

1 голос
/ 08 октября 2010

Вы можете использовать Linq2Xml, чтобы легко проанализировать код:

XElement doc = XElement.Parse(...)

Затем исправьте неправильные атрибуты, используя алгоритм наилучшего совпадения с действительным словарем атрибутов в памяти.

редактировать: я написал и протестировал этот упрощенный алгоритм наилучшего соответствия (извините, это VB):

Dim validTags() As String =
            {
                "width",
                "height",
                "img"
            }

(упрощенно, вы должны создать более структурированный словарь с тегами и возможными атрибутами длякаждый тег)

Dim maxMatch As Integer = 0
Dim matchedTag As String = Nothing
For Each Tag As String In validTags
    Dim match As Integer = checkMatch(Tag, source)
    If match > maxMatch Then
        maxMatch = match
        matchedTag = Tag
    End If
Next

Debug.WriteLine("matched tag {0} matched % {1}", matchedTag, maxMatch)

Приведенный выше код вызывает метод для определения процентного соотношения исходной строки с любым допустимым тегом.

Private Function checkMatch(ByVal tag As String, ByVal source As String) As Integer

        If tag = source Then Return 100


        Dim maxPercentage As Integer = 0

        For index As Integer = 0 To tag.Length - 1

            Dim tIndex As Integer = index
            Dim sIndex As Integer = 0
            Dim matchCounter As Integer = 0

            While True
                If tag(tIndex) = source(sIndex) Then
                    matchCounter += 1
                End If

                tIndex += 1
                sIndex += 1

                If tIndex + 1 > tag.Length OrElse sIndex + 1 > source.Length Then
                    Exit While
                End If
            End While

            Dim percentage As Integer = CInt(matchCounter * 100 / Math.Max(tag.Length, source.Length))
            If percentage > maxPercentage Then maxPercentage = percentage
        Next

        Return maxPercentage

    End Function

Приведенный выше метод с учетом исходной строки и тега, находит наилучший процент совпадения, сравнивая отдельные символы.

Если в качестве входных данных указан "виджет", он находит "ширину" как наилучшее совпадение со значением совпадения 80%.

1 голос
/ 08 октября 2010

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

что-то похожее на:

String[] ValidItems = {"alt", "src", "width", "height", "align", "border", "hspace", "longdesc", "vpace"};

Dictionary<String, String> MispeltItems = { {"al", "alt" } };

for(int i = ImgTagAttributes-1; i >= 0; i--)
{
    var element = ImgTagAttributes[i];
    if(!ValidItems.Contains(element))
    {
        if(MispeltItems.ContainsKey(element))
        {
            ImgTagElements.Replace(element, MispeltItems[element].Value);
            //Or use remove and insert.
        }
        else
        {
            ImgTagElements.RemoveAt(i);
        }
    }
}

(записал это в переполнении стека, если есть какие-то ошибки, просто скажите, это просто, чтобы вы могли получить основную идею)

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