Html Agility Pack - это нижний регистр CASE SeNSiTive SVG-атрибуты - PullRequest
0 голосов
/ 14 мая 2018

ViewBox (обратите внимание на заглавную букву "B") является чувствительным к регистру атрибутом.Изменение значения на «viewbox» может привести к тому, что элемент будет отображаться некорректно или не отображаться вообще.

HtmlAgilityPack по умолчанию использует все (X) атрибуты HTML в нижнем регистре.Как я могу предотвратить это?

Пример HTML-страницы с допустимым элементом SVG (обратите внимание на атрибут viewBox в случае с верблюдом):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link href="default.css" rel="stylesheet" type="text/css"/>
    </head>
    <body style="background-color: #000007">
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewBox="0 0 600 800">
            <rect x="0" y="0" fill="#000007" width="600" height="100%"/>
            <image width="600" height="800" xlink:href="images/cover.jpg" transform="translate(0 0)" />
        </svg>
    </body>
</html>

Для простоты, скажем, я хочудобавить тег заголовка (если отсутствует).

 Private Function InsertTitleTagIfMissing(p_content As String) As String
        Dim _pageContent = p_content
        Dim _doc = New HtmlAgilityPack.HtmlDocument()
        _doc.OptionWriteEmptyNodes = True

        _doc.LoadHtml(p_content)

        Dim _head = _doc.DocumentNode.SelectSingleNode("//head")
        Dim _title = _head.SelectSingleNode("title")

        If _title Is Nothing Then
            _title = _doc.CreateElement("title")
            _head.AppendChild(_title)
            _pageContent = _doc.DocumentNode.OuterHtml
        End If

        Return _pagecontent

    End Function

    Private Sub LoadTestFile
        Dim _exampleFileName = "C:\_testPage\cover.html"
        Dim _strContents As String = String.empty


        using _objReader = New StreamReader(_exampleFileName, True)
            _strContents = _objReader.ReadToEnd()
            _objReader.close
        End Using

        _strContents = InsertTitleTagIfMissing(_strContents)

        System.Diagnostics.Debugger.Break()
    End Sub

Вывод (т. е. значение _strContents) (обратите внимание, что атрибут viewbox теперь в нижнем регистре.):

<?xml version="1.0" encoding="UTF-8" />
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link href="default.css" rel="stylesheet" type="text/css" />
        <title></title>
    </head>
    <body style="background-color: #000007">
        <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100%" height="100%" viewbox="0 0 600 800">
            <rect x="0" y="0" fill="#000007" width="600" height="100%"></rect>
            <image width="600" height="800" xlink:href="images/cover.jpg" transform="translate(0 0)"></image>
        </svg>
    </body>
</html>

1 Ответ

0 голосов
/ 15 мая 2018

С помощью @ccprog решение, которое я нашел, состоит в том, чтобы установить OptionOutputAsXml и OptionOutputOriginalCase в TRUE.

Private Function InsertTitleTagIfMissing(p_content As String) As String
    Dim _pageContent = p_content
    Dim _doc = New HtmlAgilityPack.HtmlDocument()
    _doc.OptionWriteEmptyNodes = True
    _doc.OptionOutputAsXml = True
    _doc.OptionOutputOriginalCase = true

    _doc.LoadHtml(p_content)

    Dim _head = _doc.DocumentNode.SelectSingleNode("//head")
    Dim _title = _head.SelectSingleNode("title")

    If _title Is Nothing Then
        _title = _doc.CreateElement("title")
        _head.AppendChild(_title)
        _pageContent = _doc.DocumentNode.OuterHtml
    End If

    Return _pagecontent

End Function
...