<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    天道酬勤

    點點滴滴的足跡,幻化成漫天的云彩
    posts - 22, comments - 0, trackbacks - 0, articles - 2
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    1G多的XML轉檔

    Posted on 2011-07-29 00:32 匆匆過客 閱讀(388) 評論(0)  編輯  收藏 所屬分類: Xml
    問題:
       存在一個1G多的XML文件,需要將其中的數據,按照一定的邏輯提取數據,做一定的格式化處理和處理邏輯,生成3個不同的文本文件

    解決:
       做XML的轉換,有如下的幾個選擇:1. DOM + XSL ;2. DOM + 自己解析 ; 3:SAX + 自己解析。因為擔心performance的問題,所以決定采用SAX + Stack的方式來處理。因為要生成3個文件,所以設計3個類來負責分別產生3個文件。然后通過鏈表的方式串接起來,讓他們截獲自己concern的內容,做進一步的處理。最后各自產生自己負責的文件。

    其中:
    XmlTextReader : VB.NET的SAX XML Reader。他會逐一讀到XML的指令,COMMENT,開始TAG,文本,結束TAG等內容

    Processor : 解析XML,產生文本文件的處理器接口。里面定義了5個方法。他們分別是,open():用來打開文件;close():用來關閉文件;startTag():當XmlTextReader讀到開始TAG的時候,就會呼叫Processor的這個方法,將TAG名字,Tag的Stack,Value的Stack作為參數傳入;endTag():當XmlTextReader讀到結束TAG的時候,就會呼叫Processor的這個方法,將TAG名字,Tag的Stack,Value的Stack作為參數傳入;text():當XmlTextReader讀到文本內容的時候,就會呼叫Processor的這個方法,將文本值,Tag的Stack,Value的Stack作為參數傳入

    Executor:作為XmlTextReader和各種Processor交互的橋梁。在他的內部,各種不同的Processor會以鏈表的形式組合在一塊兒。當XmlTextReader讀到開始Tag,文本,結束Tag的時候,就會去invoke Excutor的相應方法,而Executor則會逐一invoke 各種processor相應方法,若其中有一procceor處理了某個請求,則終止向后續傳。最后一個DefaultProcessor,他的存在只是為了保證tagStask,valueStack的完整性而已。

    TProcessor,DProcessor,PProcessor:負責接收只有自己感興趣的xml內容,然后轉交給TagWrapper,做格式化,業務邏輯處理而已。在startTag(),text()方法里面,處理邏輯是,如果是自己關心的內容,則直接入棧;在endTag()方法里面,處理邏輯是,如果是自己關心的內容,則判斷是否到了一條記錄生成完成的時候(根據endTag標志),如果是則將記錄寫入到文件當中,否則將startTag出棧,valueTag出棧,將value,tag名字交給TagWrapper鏈表,做內部的格式化和業務邏輯處理。

    程序的流程如下:



    部分程序代碼(VB.NET)
    Main的部分
    Dim m_xmlr As XmlTextReader

            
    Dim tagStack As New Stack

            
    Dim valueStack As New Stack

            
    Dim executor As Processor = New Executor("c:\TOTFA""c:\DTLFA""c:\ORDFA")
            executor.open()
            m_xmlr 
    = New XmlTextReader("c:\test2.xml")
            m_xmlr.WhitespaceHandling 
    = WhitespaceHandling.None
            
    While m_xmlr.Read()
                
    Select Case m_xmlr.NodeType
                    
    Case XmlNodeType.XmlDeclaration
                        Continue 
    While

                    
    Case XmlNodeType.ProcessingInstruction
                        Continue 
    While

                    
    Case XmlNodeType.Element
                        executor.startTag(m_xmlr.Name, tagStack, valueStack)

                    
    Case XmlNodeType.EndElement
                        executor.endTag(m_xmlr.Name, tagStack, valueStack)

                    
    Case XmlNodeType.Text
                        executor.text(m_xmlr.Value, tagStack, valueStack)
                
    End Select
            
    End While
            m_xmlr.Close()
            executor.close()

    Executor的部分
    Public Class Executor
        Implements Processor

        
    Private list As New List(Of Processor)

        
    Public Sub New(ByVal TOTFA As String, ByVal DTLFA As String, ByVal ORDFA As String)

            
    Dim tp As TProcessor = New TProcessor(TOTFA)
            
    Dim dp As DProcessor = New DProcessor(DTLFA, tp)
            
    Dim pp As PProcessor = New PProcessor(ORDFA, tp, dp)
            list.Add(tp)
            list.Add(dp)
            list.Add(pp)
            list.Add(
    New DefaultProcessor())
        
    End Sub

        
    Function startTag(ByVal tagName As String, ByRef tagStack As Stack, ByRef valueStack As Stack) As Boolean Implements Processor.startTag
            
    Dim index As Integer = list.Count
            
    For index = 0 To list.Count - 1
                
    Dim processor As Processor = list.Item(index)
                
    If (processor.startTag(tagName, tagStack, valueStack)) Then
                    Return 
    True
                
    End If
            
    Next
            Return 
    True
        
    End Function

        
    Function endTag(ByVal tagName As String, ByRef tagStack As Stack, ByRef valueStack As Stack) As Boolean Implements Processor.endTag
            
    Dim index As Integer = list.Count
            
    For index = 0 To list.Count - 1
                
    Dim processor As Processor = list.Item(index)
                
    If (processor.endTag(tagName, tagStack, valueStack)) Then
                    Return 
    True
                
    End If
            
    Next
            Return 
    True
        
    End Function

        
    Function text(ByVal value As String, ByRef tagStack As Stack, ByRef valueStack As Stack) As Boolean Implements Processor.text
            
    Dim index As Integer = list.Count
            
    For index = 0 To list.Count - 1
                
    Dim processor As Processor = list.Item(index)
                
    If (processor.text(value, tagStack, valueStack)) Then
                    Return 
    True
                
    End If
            
    Next
            Return 
    True
        
    End Function

        
    Sub open() Implements Processor.open
            
    Dim index As Integer = list.Count
            
    For index = 0 To list.Count - 1
                
    Dim processor As Processor = list.Item(index)
                processor.open()
            
    Next
        
    End Sub

        
    Sub close() Implements Processor.close
            
    Dim index As Integer = list.Count
            
    For index = 0 To list.Count - 1
                
    Dim processor As Processor = list.Item(index)
                processor.close()
            
    Next
        
    End Sub
    End Class

    TProcessor代碼
    Imports System.IO
    Imports System.Text
    Imports System.Text.RegularExpressions

    Public Class TProcessor
        Implements Processor

        
    Private tagWrapperList As New List(Of TagWrapper)

        
    Private sw As StreamWriter

        
    Private filename As String

        
    Public Sub New(ByVal filename As String)
            Me.filename 
    = filename
            tagWrapperList.Add(
    New TagWrapper("t1""欄位說明""  "20, FormatterFactory.getInstance().getRBlankFormatter()))
            tagWrapperList.Add(
    New TagWrapper("t2""欄位說明""          "100, FormatterFactory.getInstance().getRBlankFormatter()))
            tagWrapperList.Add(New TagWrapper("t3""欄位說明""00000"50, FormatterFactory.getInstance().getYearMonthFormatter()))
            tagWrapperList.Add(New TagWrapper("t4""欄位說明"" "10, FormatterFactory.getInstance().getRBlankFormatter()))
            tagWrapperList.Add(New TagWrapper("t5""欄位說明"" "10, FormatterFactory.getInstance().getRBlankFormatter()))
            tagWrapperList.Add(New TagWrapper("t6""欄位說明""0000000"70, FormatterFactory.getInstance().getYearMonthDateFormatter()))
            tagWrapperList.Add(New TagWrapper("t7""欄位說明""000000"60, FormatterFactory.getInstance().getRZeroFormatter()))
            tagWrapperList.Add(New TagWrapper("t8""欄位說明""0000000000"100, FormatterFactory.getInstance().getRZeroFormatter()))
            tagWrapperList.Add(New TagWrapper("t9""欄位說明""000000"60, FormatterFactory.getInstance().getRZeroFormatter()))
            tagWrapperList.Add(New TagWrapper("t10""欄位說明""0000000000"100, FormatterFactory.getInstance().getRZeroFormatter()))
            tagWrapperList.Add(New TagWrapper("t11""欄位說明""000000"60, FormatterFactory.getInstance().getRZeroFormatter()))
            tagWrapperList.Add(New TagWrapper("t12""欄位說明""0000000000"100, FormatterFactory.getInstance().getRZeroFormatter()))
            tagWrapperList.Add(New TagWrapper("t13""欄位說明""000000"60, FormatterFactory.getInstance().getRZeroFormatter()))  
        End Sub

        
    Public Sub close() Implements Processor.close
            
    If Not (sw Is NothingThen
                sw.Close()
            
    End If
        
    End Sub

        
    Public Function endTag(ByVal tagName As String, ByRef tagStack As System.Collections.Stack, ByRef valueStack As System.Collections.Stack) As Boolean Implements Processor.endTag
            
    ‘匹配TProcessor所關心的代碼        
            If
     (Not Regex.IsMatch(tagName, "tdata|t\d+"Or String.Compare(tagName, tagStack.Peek) <> 0Then
                Return 
    False
            
    End If

            
    If (String.Compare(tagStack.Peek, "tdata"= 0 And String.Compare(tagName, tagStack.Peek) = 0Then
                tagStack.Pop()
                flush()
            
    ElseIf (valueStack.Count <> 0 And String.Compare(tagStack.Peek, tagName) = 0Then
                
    execute(tagStack.Pop(), valueStack.Pop())
            
    End If
            Return 
    True
        
    End Function

        
    Public Sub open() Implements Processor.open
            sw 
    = New StreamWriter(Me.filename)
        
    End Sub

        
    Public Function startTag(ByVal tagName As String, ByRef tagStack As System.Collections.Stack, ByRef valueStack As System.Collections.Stack) As Boolean Implements Processor.startTag
            
    If (Not Regex.IsMatch(tagName, "tdata|t\d+")) Then
                Return 
    False
            
    End If
            tagStack.Push(tagName)
            Return 
    True
        
    End Function

        
    Public Function text(ByVal value As String, ByRef tagStack As System.Collections.Stack, ByRef valueStack As System.Collections.Stack) As Boolean Implements Processor.text
            
    If (Not Regex.IsMatch(tagStack.Peek, "tdata|t\d+")) Then
                Return 
    False
            
    End If
            valueStack.Push(value)
            Return 
    True
        
    End Function

     

        
    Private Sub flush()
            
    Dim ret As StringBuilder = New StringBuilder("")
            
    Dim index As Integer
            
    For index = 0 To tagWrapperList.Count - 1
                
    Dim tag As TagWrapper = tagWrapperList.Item(index)
                ret.Append(tag.getFormatValue())
            
    Next
            sw.Write(ret.ToString)
            sw.Flush()
        
    End Sub

        
    Private Sub execute(ByVal tagName As String, ByVal value As String)
            
    For index = 0 To tagWrapperList.Count - 1
                
    Dim wrapper As TagWrapper = tagWrapperList.Item(index)
                
    If (wrapper.accept(tagName)) Then
                    wrapper.Value 
    = value                
                    
    Exit Sub
                
    End If
            
    Next
        
    End Sub

    End Class


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 免费大黄网站在线观看| 国产精品免费_区二区三区观看 | 在线亚洲精品自拍| 国产AV无码专区亚洲AWWW| 国产亚洲日韩在线a不卡| 一级毛片完整版免费播放一区| 精品四虎免费观看国产高清午夜| 国产精成人品日日拍夜夜免费| 欧美好看的免费电影在线观看| 四虎永久在线精品免费观看地址| 久久亚洲伊人中字综合精品| 亚洲乱码一区av春药高潮| 亚洲AV无码一区二区三区久久精品 | 亚洲一级免费视频| 成人毛片视频免费网站观看| 在线精品亚洲一区二区小说| eeuss影院免费直达入口| 亚洲视频免费播放| 亚洲最大激情中文字幕| 两个人www免费高清视频| 四虎最新永久免费视频| 精品亚洲AV无码一区二区三区| 99视频在线观看免费| 免费看大美女大黄大色| 亚洲av无码av制服另类专区| 亚洲一区二区观看播放| 黄色片免费在线观看| 久久水蜜桃亚洲av无码精品麻豆| 偷自拍亚洲视频在线观看| 亚洲视频在线一区二区| 亚洲人成自拍网站在线观看| 最近新韩国日本免费观看| 国产亚洲欧洲Aⅴ综合一区| 国产成人亚洲精品蜜芽影院| 国产亚洲精品a在线观看| 每天更新的免费av片在线观看| 亚洲熟妇丰满xxxxx| 久久久无码精品亚洲日韩软件| 午夜免费福利视频| 亚洲国产综合精品中文第一区| 99免费精品视频|