编程实战——电影管理器之XML存储电影信息数据

简介: 但凡管理器之类的软件,存储数据是必不可少的。存储数据的话,有几种选择。一是用数据库,把数据存储到数据库里;一是用文本文件,把数据存储到文本文件里;一种是利用XML文件,把数据对象转换为XML后,存储到XML文件(实际上也是文本文件)。

但凡管理器之类的软件,存储数据是必不可少的。存储数据的话,有几种选择。一是用数据库,把数据存储到数据库里;一是用文本文件,把数据存储到文本文件里;一种是利用XML文件,把数据对象转换为XML后,存储到XML文件(实际上也是文本文件)。

 

把数据对象和XML文件对应起来,有一个术语,称之为XML序列化。参看之前写的文章“利用XML序列化实现程序配置文件”,“简述Xml.Serialization如何序列化对象到XML文件

 

在本软件的设计中,设计了两种基本的数据对象

一是电影对象(类clsFilm),存储一部电影的信息,如:中文名(DesChineseName)、英文名(DesEnglishName)、时长(DesDuration)等

二是电影合集对象(类clsFilmCollection),存储多部电影合集的信息,如:中文名(DesChineseName)、文件个数(DesCount)、文件总大小(DesTotalSize)等。

 

在设计上,电影合集对象(类clsFilmCollection)包含子集合(ChildFilmItem),子集合(ChildFilmItem)中的元素可以是电影对象(类clsFilm)也可以是电影集合对象(类clsFilmCollection)。

例如:我现在有一个名为“欧美”的电影集合对象,子集合包含了名为“遗落战境”的电影对象和名为“变形金刚”的电影集合对象。而“变形金刚”的电影集合对象又包含了名为“变形金刚壹”、“变形金刚贰”、“变形金刚叁”的电影对象。

 

把这两种不同的类(类clsFilm和类clsFilmCollection)统一到集合(ChildFilmItem)中,采用的办法是让它们都实现I_Film接口(或者是定义一个抽象基类,两个类都去继承这个抽象基类)。如下面代码所示

 
Public  Interface  I_Film
    Property Title As  String
    ReadOnly  Property FilmImage As  Image
    Property Des1 As  String
    Property Des2 As  String
    Property Des3 As  String
    Property Des4 As  String
    Function Hint() As  List( Of  I_Film)
    Function [GetType]() As  Type
End  Interface

Public  Class  clsFilm
    Implements  I_Film

    Private _Des(3) As  String
    Private _Title As  String
    Private _ImageFile As  String
    Private _Image As  Image

    Private _FileName As  String

    Public  Sub  New()
        _Image = Nothing
    End  Sub

    Public  Property FileName As  String
        Set(value As  String)
            _FileName = value
        End  Set
        Get
            Return _FileName
        End  Get
    End  Property

    Public  Property DesEnglishName As  String  Implements  I_Film.Des1
        Get
            Return _Des(0)
        End  Get
        Set(value As  String)
            _Des(0) = value
        End  Set
    End  Property

    Public  Property DesAudioLanguage As  String  Implements  I_Film.Des2
        Get
            Return _Des(1)
        End  Get
        Set(value As  String)
            _Des(1) = value
        End  Set
    End  Property

    Public  Property DesResolution As  String  Implements  I_Film.Des3
        Get
            Return _Des(2)
        End  Get
        Set(value As  String)
            _Des(2) = value
        End  Set
    End  Property

    Public  Property DesDuration As  String  Implements  I_Film.Des4
        Get
            Return _Des(3)
        End  Get
        Set(value As  String)
            _Des(3) = value
        End  Set
    End  Property

    Public  Property ImageFile As  String
        Get
            Return _ImageFile
        End  Get
        Set(value As  String)
            _ImageFile = value
        End  Set
    End  Property

    Public  ReadOnly  Property FilmImage As System.Drawing. Image  Implements  I_Film.FilmImage
        Get
            If _Image Is  Nothing  Then
                _Image = Image.FromFile(_ImageFile).GetThumbnailImage(100, 140, Nothing, System. IntPtr.Zero)
            End  If
            Return _Image
        End  Get
    End  Property

    Public  Property DesChineseName As  String  Implements  I_Film.Title
        Get
            Return _Title
        End  Get
        Set(value As  String)
            _Title = value
        End  Set
    End  Property

    Public  Function Hint() As  List( Of  I_Film) Implements  I_Film.Hint
        Return  Nothing
    End  Function

    Public  Function GetType1() As System. Type  Implements  I_Film.GetType
        Return  Me.GetType
    End  Function
End  Class

Public  Class  clsFilmCollection
    Implements  I_Film

    Private _Title As  String
    Private _Des(3) As  String

    Private _ImageFile As  String
    Private _Image As  Image

    Public ChildFilmItem As  List( Of  I_Film)

    Public  Sub  New()
        ChildFilmItem = New  List( Of  I_Film)
    End  Sub

    Public  Property DesEnglishName As  String  Implements  I_Film.Des1
        Get
            Return _Des(0)
        End  Get
        Set(value As  String)
            _Des(0) = value
        End  Set
    End  Property

    Public  Property DesLanguage As  String  Implements  I_Film.Des2
        Get
            Return _Des(1)
        End  Get
        Set(value As  String)
            _Des(1) = value
        End  Set
    End  Property

    Public  Property DesCount As  String  Implements  I_Film.Des3
        Get
            Return _Des(2)
        End  Get
        Set(value As  String)
            _Des(2) = value
        End  Set
    End  Property

    Public  Property DesTotalSize As  String  Implements  I_Film.Des4
        Get
            Return _Des(3)
        End  Get
        Set(value As  String)
            _Des(3) = value
        End  Set
    End  Property

    Public  Property ImageFile As  String
        Get
            Return _ImageFile
        End  Get
        Set(value As  String)
            _ImageFile = value
        End  Set
    End  Property

    Public  ReadOnly  Property FilmImage As System.Drawing. Image  Implements  I_Film.FilmImage
        Get
            If _Image Is  Nothing  Then
                _Image = Image.FromFile(_ImageFile).GetThumbnailImage(100, 140, Nothing, System. IntPtr.Zero)
            End  If
            Return _Image
        End  Get
    End  Property

    Public  Function Hint() As  List( Of  I_Film) Implements  I_Film.Hint
        Return ChildFilmItem
    End  Function

    Public  Property DesChineseName As  String  Implements  I_Film.Title
        Get
            Return _Title
        End  Get
        Set(value As  String)
            _Title = value
        End  Set
    End  Property

    Public  Function GetType1() As System. Type  Implements  I_Film.GetType
        Return  Me.GetType
    End  Function
End  Class

 

把这两个类(clsFilm和clsFilmCollection)实现相同的接口(I_Film),一是可以统一到一个集合中,另一个是在渲染到主画面的时候,只要针对接口I_Film编写代码即可。比方说,接口I_Film的Des4属性,在渲染的时候,只要把这个属性渲染到第四行即可。而相应的,类clsFilm对应的属性是DesDuration属性(时长),类clsFilmCollection对应的属性是DesTotalSize(总文件大小)。

 

还需要一个管理类,来管理它们,于是初步写了下面的类

 
Public  Class  clsFilmManager
    Private _Films As  List( Of  I_Film)

    Public  Sub  New()
        _Films = New  List( Of  I_Film)
    End  Sub
End  Class

 

接着用XmlSerializer类尝试把上面这个类序列化到XML文件。但是报错,没有序列化成功。在网上查了相关的资料后,有人说XmlSerializer类不支持序列化接口的集合,在把接口改成抽象类之后,就可以了。OK!!把接口改成抽象类试了试,还是不行(代码就不贴了)。

仔细想想,接口I_Film,有两个类clsFilm和clsFilmCollection实现它。在序列化的时候,XmlSerializer类可能无法明确的知道该接口对应是哪个类而导致序列化失败。

 

那就自己写一个XML的转换的类(clsFilmXml),实现数据对象和XML文件转换的功能。

先定义两个内部变量,_FileName和FilmCollections。FilmCollections是个clsFilmCollection集合。在我的设计里,程序启动的时候包含“欧美”、“动画”、“国内”、“港台”、“日韩”、“纪录”这六个电影合集。每个合集下再各自包含电影或电影合集

  
    Private _FileName As  String
    Public FilmCollections As  List( Of  clsFilmCollection)

    Public  Sub  New()
        FilmCollections = New  List( Of  clsFilmCollection)
    End  Sub

 

 

接下来是Load方法,把XML文件转换为电影数据对象。调用两个私有方法:_XML2Film方法,把XML文件中的FilmInfo标签转换为clsFilm对象;_XML2FilmCollection方法,把XML文件中的FilmCollection标签转换为clsFilmCollection对象。在_XML2FilmCollection方法中,还对子标签进行判断,如果是FilmInfo标签,则调用_XML2Film方法获得clsFilm对象;如果是FilmCollection标签,则再调用_XML2FilmCollection方法获得clsFilmCollection对象。

  
    Public  Sub Load(XmlFile As  String)
        _FileName = XmlFile

        Dim Document As  New Xml. XmlDocument
        Document.Load(_FileName)

        Dim Films As Xml. XmlElement

        For  Each Films In Document.DocumentElement.ChildNodes
            If Films.Name = "FilmCollection"  Then FilmCollections.Add(_XML2FilmCollection(Films))
        Next
    End  Sub 

    Private  Function _XML2Film(Element As Xml. XmlElement) As  clsFilm
        Dim Film As  New  clsFilm

        Dim ChildElement As Xml. XmlElement

        For  Each ChildElement In Element.ChildNodes
            Select  Case ChildElement.Name
                Case  "FileName"
                    Film.FileName = ChildElement.InnerText
                Case  "ImageFile"
                    Film.ImageFile = ChildElement.InnerText
                Case  "DesChineseName"
                    Film.DesChineseName = ChildElement.InnerText
                Case  "DesEnglishName"
                    Film.DesEnglishName = ChildElement.InnerText
                Case  "DesDuration"
                    Film.DesDuration = ChildElement.InnerText
                Case  "DesResolution"
                    Film.DesResolution = ChildElement.InnerText
                Case  "DesAudioLanguage"
                    Film.DesAudioLanguage = ChildElement.InnerText
            End  Select 
        Next

        Return Film
    End  Function

    Private  Function _XML2FilmCollection(Element As Xml. XmlElement) As  clsFilmCollection
        Dim Films As  New  clsFilmCollection

        Dim ChildElement As Xml. XmlElement

        For  Each ChildElement In Element.ChildNodes
            Select  Case ChildElement.Name
                Case  "ImageFile"
                    Films.ImageFile = ChildElement.InnerText
                Case  "DesChineseName"
                    Films.DesChineseName = ChildElement.InnerText
                Case  "DesEnglishName"
                    Films.DesEnglishName = ChildElement.InnerText
                Case  "DesLanguage"
                    Films.DesLanguage = ChildElement.InnerText
                Case  "DesCount"
                    Films.DesCount = ChildElement.InnerText
                Case  "DesTotalSize"
                    Films.DesTotalSize = ChildElement.InnerText
                Case  "FilmInfo"
                    Films.ChildFilmItem.Add(_XML2Film(ChildElement))
                Case  "FilmCollection"
                    Films.ChildFilmItem.Add(_XML2FilmCollection(ChildElement))
            End  Select
        Next
        Return Films
    End  Function

 

 

接下来是Save方法,把电影数据对象转换为XML文件。和Load方法类似,也是调用了两个私有方法:_Film2XML方法,把clsFilm对象转换为FilmInfo标签;_FilmCollection2XML方法,把clsFilmCollection对象转换为FilmCollection标签。在_FilmCollection2XML方法中,对clsFilmCollection对象的ChildFilmItem集合中的元素进行判断(利用FilmItem.GetType Is GetType(clsFilm)语句进行判断),若是clsFilm对象,调用_Film2XML方法获得FilmInfo标签;若不是,再调用_FilmCollection2XML方法获得FilmCollection标签。

  
    Public  Sub Save( Optional XmlFile As  String = "")
        If XmlFile = ""  Then XmlFile = _FileName

        Dim Document As  New Xml. XmlDocument

        Dim Root As Xml. XmlElement = Document.CreateElement( "FilmRoot")

        Dim Films As  clsFilmCollection

        For  Each Films In FilmCollections
            Root.AppendChild(_FilmCollection2XML(Films, Document))
        Next

        Document.AppendChild(Root)
        Document.Save(XmlFile)
    End  Sub

    Private  Function _Film2XML(Film As  clsFilm, XML As Xml. XmlDocument) As Xml. XmlElement
        Dim FilmElement As Xml. XmlElement = XML.CreateElement( "FilmInfo")

        FilmElement.InnerXml = String.Format( "<FileName>{0}</FileName><ImageFile>{1}</ImageFile><DesChineseName>{2}</DesChineseName><DesEnglishName>{3}</DesEnglishName><DesDuration>{4}</DesDuration><DesResolution>{5}</DesResolution><DesAudioLanguage>{6}</DesAudioLanguage>", Film.FileName, Film.ImageFile, Film.DesChineseName, Film.DesEnglishName, Film.DesDuration, Film.DesResolution, Film.DesAudioLanguage)
        Return FilmElement
    End  Function

    Private  Function _FilmCollection2XML(Films As  clsFilmCollection, Document As Xml. XmlDocument) As Xml. XmlElement
        Dim FilmCollectionElement As Xml. XmlElement = Document.CreateElement( "FilmCollection")

        Dim S As  String = ""
        With Films
            If .ImageFile <> ""  Then S &= String.Format( "<ImageFile>{0}</ImageFile>", .ImageFile)
            If .DesChineseName <> ""  Then S &= String.Format( "<DesChineseName>{0}</DesChineseName>", .DesChineseName)
            If .DesEnglishName <> ""  Then S &= String.Format( "<DesEnglishName>{0}</DesEnglishName>", .DesEnglishName)
            If .DesLanguage <> ""  Then S &= String.Format( "<DesLanguage>{0}</DesLanguage>", .DesLanguage)
            If .DesCount <> ""  Then S &= String.Format( "<DesCount>{0}</DesCount>", .DesCount)
            If .DesTotalSize <> ""  Then S &= String.Format( "<DesTotalSize>{0}</DesTotalSize>", .DesTotalSize)
        End  With

        FilmCollectionElement.InnerXml = S

        Dim FilmItem As  I_Film
        For  Each FilmItem In Films.ChildFilmItem
            If FilmItem.GetType Is  GetType( clsFilm) Then
                FilmCollectionElement.AppendChild(_Film2XML(FilmItem, Document))
            Else
                FilmCollectionElement.AppendChild(_FilmCollection2XML(FilmItem, Document))
            End  If
        Next
        Return FilmCollectionElement
    End  Function

 

 

为了后面的准备,我们有时需要获得所有的电影的中文名。于是,写了下面的两个方法。GetAllDesChineseName方法获得所有的电影的中文名,私有方法_GetAllDesChineseName获得指定clsFilmCollection对象下的所有的电影的中文名。还是利用FilmItem.GetType Is GetType(clsFilm)来判断是否是clsFilm对象,由于FilmItem是接口I_Film对象,那么如果FilmItem是clsFilm对象,则调用接口I_Film中的Des1属性(对应clsFilm对象的DesChineseName属性)来获得电影的中文名。

  
    Public  Function GetAllDesChineseName() As  List( Of  String)
        Dim Films As  clsFilmCollection
        Dim Names As  New  List( Of  String)

        For  Each Films In FilmCollections
            Names.AddRange(_GetAllDesChineseName(Films))
        Next
        Return Names
    End  Function

    Private  Function _GetAllDesChineseName(Films As  clsFilmCollection) As  List( Of  String)
        Dim FilmItem As  I_Film
        Dim Names As  New  List( Of  String)

        For  Each FilmItem In Films.ChildFilmItem
            If FilmItem.GetType Is  GetType( clsFilm) Then
                Names.Add(FilmItem.Des1)
            Else
                Names.AddRange(_GetAllDesChineseName(FilmItem))
            End  If
        Next

        Return Names
    End  Function

最后是把电影添加到集合的方法。

有两个方法:

AddFilm方法,把clsFilm对象添加到由Films指定的集合中。例如AddFilm(Film , "欧美"),把Film添加到名为“欧美”的电影集合中

AddFilmByBrother方法,把clsFilm对象和BrotherFilm指定的电影组成一个集合

例如:原本已经有“变形金刚壹”这部电影,现在又有“变形金刚贰”这部电影,我当然希望这两部电影能在一个电影集合中,即“变形金刚”集合。

那么我可以调用AddFilmByBrother(Film , "变形金刚壹")来实现该功能。

首先要找到“变形金刚壹”电影的clsFilm对象,以及该对象所处的clsFilmCollection对象。通过私有方法_FindBrother来实现。

再判断该对象所处的clsFilmCollection对象是否是顶级集合(如“欧美”集合,通过判断clsFilmCollection对象的ImageFile属性)

如果是顶级集合,则新建一个clsFilmCollection对象,把这两部影片都添加到这个新建的clsFilmCollection对象(例如:把“变形金刚壹”和“变形金刚贰”都添加到新建的clsFilmCollection对象)。把BrotherFilm指定的电影从顶级集合中删掉。把新建的clsFilmCollection对象添加到顶级集合。

如果不是顶级集合(之前可能“变形金刚壹”和“变形金刚前传”组成了集合“变形金刚”),则把新电影添加到这个集合即可(把“变形金刚贰”添加到“变形金刚”集合)

 

最后_GetTotalSize方法是获得指定集合中所有的文件的大小,以GB为单位。

  
    Public  Sub AddFilm(Film As  clsFilm, Films As  String)
        Dim FilmItem As  clsFilmCollection

        For  Each FilmItem In FilmCollections
            If FilmItem.DesChineseName = Films Then
                FilmItem.ChildFilmItem.Add(Film)
                Exit Sub
            End  If
        Next
    End  Sub

    Public  Sub AddFilmByBrother(Film As  clsFilm, BrotherFilm As  String)

        Dim Films As  clsFilmCollection, Brother As  clsFilm = Nothing

        For  Each Films In FilmCollections
            _FindBrother(BrotherFilm, Films, Brother)
            If  Not (Brother Is  Nothing) Then
                If Films.ImageFile = ""  Then
                    Films.ChildFilmItem.Remove(Brother)
                    Dim NewFilms As  New  clsFilmCollection
                    NewFilms.DesChineseName = Brother.DesChineseName
                    NewFilms.DesEnglishName = Brother.DesEnglishName
                    NewFilms.DesLanguage = Brother.DesAudioLanguage
                    NewFilms.DesCount = 2
                    NewFilms.ImageFile = Brother.ImageFile
                    NewFilms.ChildFilmItem.Add(Brother)
                    NewFilms.ChildFilmItem.Add(Film)
                    NewFilms.DesTotalSize = _GetTotalSize(NewFilms)

                    Films.ChildFilmItem.Add(NewFilms)
                Else
                    Films.ChildFilmItem.Add(Film)
                    Films.DesCount = CInt(Films.DesCount) + 1
                    Films.DesTotalSize = _GetTotalSize(Films)
                End  If
                Exit Sub
            End  If
        Next

    End  Sub

    Private  Sub _FindBrother(BrotherFilm As  String, ByRef Films As  clsFilmCollection, ByRef Brother As  clsFilm)
        Dim FilmItem As  I_Film

        For  Each FilmItem In Films.ChildFilmItem
            If FilmItem.GetType Is  GetType( clsFilm) Then
                If FilmItem.Title = BrotherFilm Then
                    Brother = FilmItem
                    Exit Sub
                End  If
            Else
                _FindBrother(BrotherFilm, FilmItem, Brother)
                If  Not (Brother Is  Nothing) Then
                    Films = FilmItem
                    Exit Sub
                End  If
            End  If
        Next
        Brother = Nothing
    End  Sub

    Private  Function _GetTotalSize(Films As  clsFilmCollection) As  String
        Dim SizeCount As  Long = 0

        Dim FilmItem As  clsFilm

        For  Each FilmItem In Films.ChildFilmItem
            SizeCount += My.Computer.FileSystem.GetFileInfo(FilmItem.FileName).Length
        Next

        SizeCount = SizeCount * 10 / 1024 / 1024 / 1024

        Return  CSng(SizeCount) / 10 & "GB" 

    End  Function

 

 

 

最后是该类的完整代码(VB2010)

 
Public  Class  clsFilmXml
    Private _FileName As  String
    Public FilmCollections As  List( Of  clsFilmCollection)

    Public  Sub  New()
        FilmCollections = New  List( Of  clsFilmCollection)
    End  Sub

    Public  Sub Load(XmlFile As  String)
        _FileName = XmlFile

        Dim Document As  New Xml. XmlDocument
        Document.Load(_FileName)

        Dim Films As Xml. XmlElement

        For  Each Films In Document.DocumentElement.ChildNodes
            If Films.Name = "FilmCollection"  Then FilmCollections.Add(_XML2FilmCollection(Films))
        Next
    End  Sub

    Public  Sub Save( Optional XmlFile As  String = "")
        If XmlFile = ""  Then XmlFile = _FileName

        Dim Document As  New Xml. XmlDocument

        Dim Root As Xml. XmlElement = Document.CreateElement( "FilmRoot")

        Dim Films As  clsFilmCollection

        For  Each Films In FilmCollections
            Root.AppendChild(_FilmCollection2XML(Films, Document))
        Next

        Document.AppendChild(Root)
        Document.Save(XmlFile)
    End  Sub

    Private  Function _Film2XML(Film As  clsFilm, XML As Xml. XmlDocument) As Xml. XmlElement
        Dim FilmElement As Xml. XmlElement = XML.CreateElement( "FilmInfo")

        FilmElement.InnerXml = String.Format( "<FileName>{0}</FileName><ImageFile>{1}</ImageFile><DesChineseName>{2}</DesChineseName><DesEnglishName>{3}</DesEnglishName><DesDuration>{4}</DesDuration><DesResolution>{5}</DesResolution><DesAudioLanguage>{6}</DesAudioLanguage>", Film.FileName, Film.ImageFile, Film.DesChineseName, Film.DesEnglishName, Film.DesDuration, Film.DesResolution, Film.DesAudioLanguage)
        Return FilmElement
    End  Function

    Private  Function _FilmCollection2XML(Films As  clsFilmCollection, Document As Xml. XmlDocument) As Xml. XmlElement
        Dim FilmCollectionElement As Xml. XmlElement = Document.CreateElement( "FilmCollection")

        Dim S As  String = ""
        With Films
            If .ImageFile <> ""  Then S &= String.Format( "<ImageFile>{0}</ImageFile>", .ImageFile)
            If .DesChineseName <> ""  Then S &= String.Format( "<DesChineseName>{0}</DesChineseName>", .DesChineseName)
            If .DesEnglishName <> ""  Then S &= String.Format( "<DesEnglishName>{0}</DesEnglishName>", .DesEnglishName)
            If .DesLanguage <> ""  Then S &= String.Format( "<DesLanguage>{0}</DesLanguage>", .DesLanguage)
            If .DesCount <> ""  Then S &= String.Format( "<DesCount>{0}</DesCount>", .DesCount)
            If .DesTotalSize <> ""  Then S &= String.Format( "<DesTotalSize>{0}</DesTotalSize>", .DesTotalSize)
        End  With

        FilmCollectionElement.InnerXml = S

        Dim FilmItem As  I_Film
        For  Each FilmItem In Films.ChildFilmItem
            If FilmItem.GetType Is  GetType( clsFilm) Then
                FilmCollectionElement.AppendChild(_Film2XML(FilmItem, Document))
            Else
                FilmCollectionElement.AppendChild(_FilmCollection2XML(FilmItem, Document))
            End  If
        Next
        Return FilmCollectionElement
    End  Function

    Private  Function _XML2Film(Element As Xml. XmlElement) As  clsFilm
        Dim Film As  New  clsFilm

        Dim ChildElement As Xml. XmlElement

        For  Each ChildElement In Element.ChildNodes
            Select  Case ChildElement.Name
                Case  "FileName"
                    Film.FileName = ChildElement.InnerText
                Case  "ImageFile"
                    Film.ImageFile = ChildElement.InnerText
                Case  "DesChineseName"
                    Film.DesChineseName = ChildElement.InnerText
                Case  "DesEnglishName"
                    Film.DesEnglishName = ChildElement.InnerText
                Case  "DesDuration"
                    Film.DesDuration = ChildElement.InnerText
                Case  "DesResolution"
                    Film.DesResolution = ChildElement.InnerText
                Case  "DesAudioLanguage"
                    Film.DesAudioLanguage = ChildElement.InnerText
            End  Select

        Next

        Return Film
    End  Function

    Private  Function _XML2FilmCollection(Element As Xml. XmlElement) As  clsFilmCollection
        Dim Films As  New  clsFilmCollection

        Dim ChildElement As Xml. XmlElement

        For  Each ChildElement In Element.ChildNodes
            Select  Case ChildElement.Name
                Case  "ImageFile"
                    Films.ImageFile = ChildElement.InnerText
                Case  "DesChineseName"
                    Films.DesChineseName = ChildElement.InnerText
                Case  "DesEnglishName"
                    Films.DesEnglishName = ChildElement.InnerText
                Case  "DesLanguage"
                    Films.DesLanguage = ChildElement.InnerText
                Case  "DesCount"
                    Films.DesCount = ChildElement.InnerText
                Case  "DesTotalSize"
                    Films.DesTotalSize = ChildElement.InnerText
                Case  "FilmInfo"
                    Films.ChildFilmItem.Add(_XML2Film(ChildElement))
                Case  "FilmCollection"
                    Films.ChildFilmItem.Add(_XML2FilmCollection(ChildElement))
            End  Select
        Next
        Return Films
    End  Function

    Public  Function GetAllDesChineseName() As  List( Of  String)
        Dim Films As  clsFilmCollection
        Dim Names As  New  List( Of  String)

        For  Each Films In FilmCollections
            Names.AddRange(_GetAllDesChineseName(Films))
        Next
        Return Names
    End  Function

    Private  Function _GetAllDesChineseName(Films As  clsFilmCollection) As  List( Of  String)
        Dim FilmItem As  I_Film
        Dim Names As  New  List( Of  String)

        For  Each FilmItem In Films.ChildFilmItem
            If FilmItem.GetType Is  GetType( clsFilm) Then
                Names.Add(FilmItem.Des1)
            Else
                Names.AddRange(_GetAllDesChineseName(FilmItem))
            End  If
        Next

        Return Names
    End  Function

    Public  Sub AddFilm(Film As  clsFilm, Films As  String)
        Dim FilmItem As  clsFilmCollection

        For  Each FilmItem In FilmCollections
            If FilmItem.DesChineseName = Films Then
                FilmItem.ChildFilmItem.Add(Film)
                Exit Sub
            End  If
        Next
    End  Sub

    Public  Sub AddFilmByBrother(Film As  clsFilm, BrotherFilm As  String)

        Dim Films As  clsFilmCollection, Brother As  clsFilm = Nothing

        For  Each Films In FilmCollections
            _FindBrother(BrotherFilm, Films, Brother)
            If  Not (Brother Is  Nothing) Then
                If Films.ImageFile = ""  Then
                    Films.ChildFilmItem.Remove(Brother)
                    Dim NewFilms As  New  clsFilmCollection
                    NewFilms.DesChineseName = Brother.DesChineseName
                    NewFilms.DesEnglishName = Brother.DesEnglishName
                    NewFilms.DesLanguage = Brother.DesAudioLanguage
                    NewFilms.DesCount = 2
                    NewFilms.ImageFile = Brother.ImageFile
                    NewFilms.ChildFilmItem.Add(Brother)
                    NewFilms.ChildFilmItem.Add(Film)
                    NewFilms.DesTotalSize = _GetTotalSize(NewFilms)

                    Films.ChildFilmItem.Add(NewFilms)
                Else
                    Films.ChildFilmItem.Add(Film)
                    Films.DesCount = CInt(Films.DesCount) + 1
                    Films.DesTotalSize = _GetTotalSize(Films)
                End  If
                Exit Sub
            End  If
        Next

    End  Sub

    Private  Sub _FindBrother(BrotherFilm As  String, ByRef Films As  clsFilmCollection, ByRef Brother As  clsFilm)
        Dim FilmItem As  I_Film

        For  Each FilmItem In Films.ChildFilmItem
            If FilmItem.GetType Is  GetType( clsFilm) Then
                If FilmItem.Title = BrotherFilm Then
                    Brother = FilmItem
                    Exit Sub
                End  If
            Else
                _FindBrother(BrotherFilm, FilmItem, Brother)
                If  Not (Brother Is  Nothing) Then
                    Films = FilmItem
                    Exit Sub
                End  If
            End  If
        Next
        Brother = Nothing
    End  Sub

    Private  Function _GetTotalSize(Films As  clsFilmCollection) As  String
        Dim SizeCount As  Long = 0

        Dim FilmItem As  clsFilm

        For  Each FilmItem In Films.ChildFilmItem
            SizeCount += My.Computer.FileSystem.GetFileInfo(FilmItem.FileName).Length
        Next

        SizeCount = SizeCount * 10 / 1024 / 1024 / 1024

        Return  CSng(SizeCount) / 10 & "GB"


    End  Function

End  Class

 

贴代码于此,也是希望和大家交流,如果有什么建议的话,望不吝赐教。

 

 

题外话

在研究Direct2D时,从官网上下载了Windows API Code Pack 1.1后

解压到文件夹,在我的开发文档里引用了Microsoft.WindowsAPICodePack.DirectX.dll

在执行初始化语句时

_d2DFactory = Direct2D1.D2DFactory.CreateFactory()

就报了如下的错误

image

 

有谁能解决这个问题么?并能提供Direct2D的详细的开发资料么。

现在还同时在研究SharpDX,但也苦于缺少相关的资料和教程,有谁能提供么?

相关文章
|
5天前
|
JavaScript Java 测试技术
基于Java的音乐电影分享系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的音乐电影分享系统的设计与实现(源码+lw+部署文档+讲解等)
19 0
|
6月前
|
Java 关系型数据库 MySQL
JSP电影平台系统myeclipse开发mysql数据库BS模式java编程网页结构
JSP 电影平台系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使用java语言开发,系统主要采用B/S模式开发。
43 0
|
8月前
|
数据采集 前端开发 Python
Python爬虫与逆向工程技术的结合,实现新闻网站动态内容的多线程抓取
Python爬虫与逆向工程技术的结合,实现新闻网站动态内容的多线程抓取
|
11月前
|
数据采集 Web App开发 算法
新闻类网页正文通用抽取器(一)——项目介绍
新闻类网页正文通用抽取器(一)——项目介绍
117 0
|
小程序 API 数据库
小程序中读取腾讯文档的表格数据
小程序中读取腾讯文档的表格数据
小程序中读取腾讯文档的表格数据
|
SQL JavaScript 前端开发
Kettle发送邮箱并在正文中以表格形式展示内容[升级版]
Kettle发送邮箱并在正文中以表格形式展示内容[升级版]
|
XML Java 数据格式
编写Java程序,创建一个 XML 文档,文档名为“hero.xml”,用于保存“王者荣耀”的英雄信息。
编写Java程序,创建一个 XML 文档,文档名为“hero.xml”,用于保存“王者荣耀”的英雄信息。
140 0
编写Java程序,创建一个 XML 文档,文档名为“hero.xml”,用于保存“王者荣耀”的英雄信息。
|
前端开发 关系型数据库 MySQL
Django实战小型图书人物信息网页(MVT的综合运用)
本文主要总结 Django 系列前面所学的知识,将前面所学的知识通过一个小案例结合起来,让大家对于 MVT 模式更加的熟练。
184 0
Django实战小型图书人物信息网页(MVT的综合运用)
|
XML C# 开发工具
艾伟_转载:C#来创建和读取XML文档
  扩展标记语言XML(eXtensible Markup Language),是由W3C组织制定的。做为用于替代HTML语言的一种新型的标记语言,XML内部有着很多基本标准,XML就是通过与这些相关标准地结合,应用于科学计算、电子出版、多媒体制作和电子商务的。
843 0
|
XML 数据格式
DEDE利用自由列表创建全站RSS订阅内容更新整站.xml文档
DEDE利用自由列表创建全站RSS订阅内容更新整站.xml文档 - 发表于:DEDE技术吧 - Dede教程 1.复制以下代码:(并且保存为rss.htm) {dede:global.
1122 0