如何在.NET中序列化/反序列化HTML表

时间:2012-01-26 15:27:37

标签: c# .net vb.net

我正在尝试编写一个类来序列化/反序列化一些简单的东西:

<table border="1">
 <tr>
 <td>row 1, cell 1</td>
 <td>row 1, cell 2</td>
 </tr>
 <tr>
 <td>row 2, cell 1</td>
 <td>row 2, cell 2</td>
 </tr>
 </table> 

我已经达到了这一点(见下文),但却无法正确生成表格xml:

Imports System.Xml.Serialization

<XmlRoot("TABLE")>
Public Class HTMLTable

    <XmlArray("")>
    <XmlArrayItem(GetType(HTMLTableRow), elementName:="TR")>
    Public Property Rows As New List(Of HTMLTableRow)

    <XmlType("TR")>
    Public Class HTMLTableRow

        <XmlArray("TD")>
        Public Property Cells As New List(Of HTMLTableCell)
    End Class

    <XmlType("TD")>
    Public Class HTMLTableCell

        <XmlText()>
        Public Property Value As String
    End Class
   End Class

通过以下测试:

  <Test()>
    Public Sub SerializeTest()
        Dim tbl As New HTMLTable
        Dim row As New HTMLTable.HTMLTableRow
        Dim cell As New HTMLTable.HTMLTableCell
        row.Cells.Add(cell)
        tbl.Rows.Add(row)
        Debug.Print(XMLProcessor.Serialize(tbl))
    End Sub

我无法让它序列化到这个东西。我尝试使用xsd生成类,但是它产生了大量的垃圾代码,我真的想手工维护它,因为它比xsd产生的怪物更容易,无论如何都没有。我上面做错了什么?

3 个答案:

答案 0 :(得分:2)

尝试更改:

<XmlArray("")>
<XmlArrayItem(GetType(HTMLTableRow), elementName:="TR")>
Public Property Rows As New List(Of HTMLTableRow)

成:

<XmlElement("TR")>
Public Property Rows As New List(Of HTMLTableRow)

,并改变:

<XmlArray("TD")>
Public Property Cells As New List(Of HTMLTableCell)

成:

<XmlElement("TD")>
Public Property Cells As New List(Of HTMLTableCell)

这就是我在为同一任务使用XmlSerializer时设置属性的方法。

我还会将HTMLTableRowHTMLTableCell类移出HTMLTable类。

另一方面,您的测试方法实际上不是一种测试方法,因为它不会执行任何Assert,并且当结果不符合您的要求时它不会抛出异常!

答案 1 :(得分:2)

我认为你想要做的是使用一个内置类来生成HTML,而不是尝试序列化对象模型。

例如,请查看HtmlTextWriter,或者如果您想要更全面的功能,HTML Agility Pack

答案 2 :(得分:-2)

我没有看到在类级别声明的Serializable()属性。 最好的问候