Генерация HTML

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 315
Зарегистрирован: 01.06.2009 (Пн) 10:26

Генерация HTML

Сообщение Admiralisimys » 29.01.2012 (Вс) 0:28

Здравствуйте.

Предыстория вопроса viewtopic.php?f=2&t=43636#p6759402
FireFenix писал(а):
Admiralisimys писал(а):На правах блиц вопроса: а для реализации обратной задачи (генерация HTML) существует удобный инструментарий?

System.XML.Serialization ?


Вот первые попытки
Код: Выделить всё
Imports System
Imports System.IO
Imports System.Text
Imports System.Xml.Serialization
Imports System.Collections.Generic

Class GeneratorOfHTML

    Private xmlser As New XmlSerializer(GetType(HtmlFile))

    <STAThread()> Public Shared Sub Main()
        Dim app As New GeneratorOfHTML()
    End Sub

    Sub New()
        Dim hFileObj As New HtmlFile()
        Dim hClass As New HtmlTag
        hClass.HEAD = New hHead()
        hClass.HEAD.TITLE = "Title of Hello World HTML Document Generated!"

        hClass.BODY = New hBody()
        hClass.BODY.H1 = "Hello World!"

        Dim hTags As New System.Collections.Generic.List(Of HtmlTag)
        hTags.Add(hClass)

        hFileObj.HTML = hTags

        ShowObjectCodeOnScreen(hFileObj)
        'SaveObjectCode2File(hFileObj, "C:\1.html")
    End Sub

    Private Sub ShowObjectCodeOnScreen(ByVal o As Object)
        Dim hCode As New StringBuilder()

        Dim sw As New StringWriter(hCode)
        xmlser.Serialize(sw, o)
        sw.Close()

        Console.WriteLine(hCode)
    End Sub

    Private Sub SaveObjectCode2File(ByVal o As Object, ByVal filepath As String)
        Dim hCode As New StringBuilder()

        Dim sw As New StreamWriter(filepath)
        xmlser.Serialize(sw, o)
        sw.Close()
    End Sub

End Class

Public Class HtmlFile
    Dim hTags As List(Of HtmlTag) = New List(Of HtmlTag)
    Public Property HTML() As List(Of HtmlTag)
        Get
            Return hTags
        End Get
        Set(ByVal value As List(Of HtmlTag))
            hTags = value
        End Set
    End Property
End Class

Public Class HtmlTag
    Private hd As hHead
    Private bd As hBody

    Public Property HEAD() As hHead
        Get
            Return hd
        End Get
        Set(ByVal value As hHead)
            hd = value
        End Set
    End Property

    Public Property BODY() As hBody
        Get
            Return bd
        End Get
        Set(ByVal value As hBody)
            bd = value
        End Set
    End Property

End Class

Public Class hHead
    Private obj As Object
    Public Property TITLE() As Object
        Get
            Return obj
        End Get
        Set(ByVal value As Object)
            obj = value
        End Set
    End Property
End Class

Public Class hBody
    Private obj As String
    Public Property H1() As Object
        Get
            Return obj
        End Get
        Set(ByVal value As Object)
            obj = value
        End Set
    End Property
End Class

Код сгенерированный программой
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<HtmlFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <HTML>
    <HtmlTag>
      <HEAD>
        <TITLE xsi:type="xsd:string">Title of Hello World HTML Document Generated!</TITLE>
      </HEAD>
      <BODY>
        <H1 xsi:type="xsd:string">Hello World!</H1>
      </BODY>
    </HtmlTag>
  </HTML>
</HtmlFile>

Не совсем так как хотелось (этот код правильно отобразит даже IE6), но уже лучше (яснее) первоначального варианта с Console.WriteLine.
Хотелось уйти класса HtmlTag, от которого планировалось наследовать HEAD и BODY, но при этом варианте исключение на строчке xmlser.Serialize.
С таким подходом планировалось постепенное формирование документа, путём добавления конструкций в список. А в текущей реализации слишком много харкодинга и список не нужен.

Подскажите, где копнуть.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Генерация HTML

Сообщение FireFenix » 29.01.2012 (Вс) 1:03

Admiralisimys писал(а):А в текущей реализации слишком много харкодинга и список не нужен

Реализуешь свои классы и свой сериализатор

P.S. Только ты не верно использовал мой совет про XMLSerializer
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 315
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Генерация HTML

Сообщение Admiralisimys » 29.01.2012 (Вс) 22:05

FireFenix какие именно классы? В приведённом примере присутствуют свои публичные классы HtmlFile, HtmlTag, hHead, hBody.
Свой сериализатор в котором будут вызовы XmlTextWriter?

В каком ключе стоит использовать XMLSerializer?

P.S.
Вот, кажется с XmlTextWriter нагляднее чем Console.WriteLine и достижимые нежели высоко конструктивные приёмы.
Код: Выделить всё
Imports System
Imports System.IO
Imports System.Xml
Imports System.Text

Class Test

    <STAThread()> Public Shared Sub Main()
        Dim app As New Test()
    End Sub

    Public Sub New()
        ShowOnScreen()
        'Save2File("C:\1.html")
    End Sub

    Private Sub ShowOnScreen()
        Dim Code As New StringBuilder()

        Dim sw As New StringWriter(Code)
        Dim xw As New XmlTextWriter(sw)

        Generator(xw)

        xw.Close()
        sw.Close()

        Console.WriteLine(Code)
    End Sub

    Private Sub Save2File(ByVal filePath As String)
        Dim sw As New StreamWriter(filePath)
        Dim xw As New XmlTextWriter(sw)

        Generator(xw)

        xw.Close()
        sw.Close()
    End Sub

    Private Sub Generator(ByVal xw As XmlTextWriter)
        'xw.WriteDocType("html", "-//W3C//DTD HTML 4.01 Transitional//EN", _
        '        "http://www.w3.org/TR/html4/loose.dtd", Nothing)
        xw.WriteRaw("<!DOCTYPE html PUBLIC ""-//W3C//DTD HTML 4.01 Transitional//EN"" ""http://www.w3.org/TR/html4/loose.dtd"">")

        xw.WriteStartElement("html")

        xw.WriteStartElement("head")
        xw.WriteElementString("title", "Hello world title")
        xw.WriteEndElement()

        xw.WriteStartElement("body")
        xw.WriteElementString("h1", "Hello world")
        xw.WriteEndElement()

        xw.WriteEndElement() REM html
    End Sub

End Class

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Генерация HTML

Сообщение 1Steps » 30.01.2012 (Пн) 3:52

OpenXml не подойдет?
Удалена за ненадобностью.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Генерация HTML

Сообщение FireFenix » 30.01.2012 (Пн) 19:17

Admiralisimys писал(а):В каком ключе стоит использовать XMLSerializer?

Ключе? Само пространство имён намекает на Сериализацию, а ты используешь классы сериализатора для представления своих данных

Admiralisimys писал(а):FireFenix какие именно классы? В приведённом примере присутствуют свои публичные классы HtmlFile, HtmlTag, hHead, hBody.
Свой сериализатор в котором будут вызовы XmlTextWriter?

В данном случае тебе необходимо реализовать нормальную структуру данных на основе классов и их передавать сериализатору, а не городить всё в ручную (Пример)
Либо полностью реализовать свой сериализатор, который бы заменил XML сериализатор, если чем-то он не устроил, к уже созданной в предыдущем пункте инфраструктуры на основе классов
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Admiralisimys
Постоялец
Постоялец
 
Сообщения: 315
Зарегистрирован: 01.06.2009 (Пн) 10:26

Re: Генерация HTML

Сообщение Admiralisimys » 31.01.2012 (Вт) 15:29

1Steps в том смысле заменить HTML на docs/xlsx? Или OpenXml помимо основных задач способен генерировать html?
В любом случае, присмотрюсь к этому средству, спасибо.

FireFenix спасибо за советы, буду пробовать.

1Steps
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 505
Зарегистрирован: 20.12.2006 (Ср) 0:50
Откуда: New York

Re: Генерация HTML

Сообщение 1Steps » 31.01.2012 (Вт) 16:17

Admiralisimys писал(а):Или OpenXml помимо основных задач способен генерировать html?
OpenXml способен генерировать документ, который по своему усмотрению ты сохраняешь в нужном тебе формате(.html, .pdf и т.д.)
Удалена за ненадобностью.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9

    TopList