Как записать пользовательский HTML-документ в файл - PullRequest
0 голосов
/ 03 мая 2011

Основной вопрос: каков наилучший способ записи данных из иерархического набора объектов в файл?Родитель высшего порядка имеет 1000 детей с детьми (стиль DOM).Попытка обойти дерево и создать одну большую строку, которая затем записывается в файл, вызывает исключение нехватки памяти при создании строки.

Подробности Я создал набор классов, которые составляют документ HTML .
Был элемент управления, который мне был нужен, чтобы предварительно упакованные HtmlElement и HtmlDocument не давали. Объектная модель документа поддерживается повсеместно, с некоторыми похожими методами и свойствами и т. Д.
Я использую пользовательские классы для создания очень большого HTML документа.Когда я говорю «большой», я имею в виду порядка 2000 печатных страниц.Сомнительно, что все они будут напечатаны, но некоторые из них будут.

Мой базовый HTMLElement объект, из которого получены все другие объекты, содержит свойство OuterHTML, которое, как и ожидалось, получает полный HTML вызывающего объекта и HTML всех дочерних элементов.
После выполнения кода, который генерирует отчет, у меня есть HTMLDocument объект, содержащий всеотчет, который нужно записать в файл.Здесь я продолжаю сталкиваться с проблемами.

Если я вызову OuterHTML для объекта HTMLDocument, я получу исключение из памяти .Другие отчеты хорошо сохранились, но это самый большой отчет, который я бросил в мой HTMLElement объект.Я предполагаю, что вызов свойства генерирует слишком много текста.

Я просто создаю новый файл .HTML , открываю его для чтения и записываю весь текст.Как:

File.WriteAllText(FileName, HtmlDoc.OuterHTML)

Итак, вопрос: что может быть лучше для этого?

1 Ответ

0 голосов
/ 06 мая 2011

Я оставил этот вопрос на пару дней, надеясь на некоторые предложения, но не повезло.Поэтому, потратив это время на попытки найти какое-то решение, я наконец-то нашел решение, которое, я думаю, довольно приличное.

В своей программе HTMLDocument.SaveDocument() я создал FileStream и StreamWriter объект.И поскольку документ представляет собой древовидную структуру, я создал рекурсивную процедуру, которая принимает StreamWriter и коллекцию тегов в качестве аргументов.

Public Sub SaveDocument(ByVal FileName As String, Optional ByVal IncludeLineBreaks As Boolean = False)
    If Len(FileName) > 0 Then
        'Save the document
        Dim fs As FileStream
        Dim s As StreamWriter
        Dim LineBreak As String = IIf(IncludeLineBreaks, vbCrLf, "").ToString()

        Try
            fs = New FileStream(FileName, FileMode.Create, FileAccess.Write)
            s = New StreamWriter(fs)
        Catch ex As Exception
            MsgBox("Cannot save the HTML document." & vbCrLf & "Error: " & ex.Message, MsgBoxStyle.OkOnly, "Save HTML Dcoument Error")
            Exit Sub
        End Try

        Try
            With s
                .BaseStream.Seek(0, SeekOrigin.End)

                'begin the html document
                .Write(Me.DocType.OuterHTML & LineBreak)
                .BaseStream.Seek(0, SeekOrigin.End)

                Me.RecursiveDocumentSave(s, Me, LineBreak)

                .Close()
            End With

        Catch ex As Exception
            MsgBox("Error saving the HTML document." & vbCrLf & "Error: " & ex.Message, MsgBoxStyle.OkOnly, "Save HTML Dcoument Error")
        End Try

        s = Nothing
        fs = Nothing
    End If
End Sub

Private Sub RecursiveDocumentSave(ByRef s As StreamWriter, ByRef tag As HTMLTag, ByVal LineBreak As String)
    s.Write(tag.OpenTagText & LineBreak)
    s.BaseStream.Seek(0, SeekOrigin.End)

    For Each t As HTMLTag In tag.Tags.Items
        If t.TagType = "TEXT" Then
            s.Write(t.Text & LineBreak)
            s.BaseStream.Seek(0, SeekOrigin.End)
        Else
            Me.RecursiveDocumentSave(s, t, LineBreak)
        End If
    Next

    s.Write(tag.CloseTagText & LineBreak)
    s.BaseStream.Seek(0, SeekOrigin.End)
End Sub

Свойство OpenTagText изящно обрабатывает теги, такие как <br /> и <img />, которые закрываются самостоятельно.У этих тегов не будет дочерних элементов, поэтому цикл for будет пропущен.

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