使用C#,我如何手动验证html标签?

时间:2010-10-08 09:45:40

标签: c# html parsing validation

我有这个图片标签:

<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" />

感谢。

杰夫

2 个答案:

答案 0 :(得分:1)

标记的解析是最困难的部分,看到你已经完成了,你现在要做的就是循环遍历元素,检查它们是否有效的数组,如果它们无效则检查它们针对一系列常见拼写错误的项目,并根据需要进行替换/删除。

Someting类似于:

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);
        }
    }
}

(在堆栈溢出中写道,如果有任何错误,只是说,这样你就可以得到一个基本的想法)

答案 1 :(得分:1)

您可以使用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

给定源字符串和标记的上述方法找到比较单个字符的最佳匹配百分比。

将“widt”作为输入,它将“width”视为与80%匹配值的最佳匹配。