`

1G多的XML转档

    博客分类:
  • 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", "栏位说明", " ", 2, 0, FormatterFactory.getInstance().getRBlankFormatter()))
     tagWrapperList.Add(New TagWrapper("t2", "栏位说明", " ", 10, 0, FormatterFactory.getInstance().getRBlankFormatter()))
     tagWrapperList.Add(New TagWrapper("t3", "栏位说明", "00000", 5, 0, FormatterFactory.getInstance().getYearMonthFormatter()))
     tagWrapperList.Add(New TagWrapper("t4", "栏位说明", " ", 1, 0, FormatterFactory.getInstance().getRBlankFormatter()))
     tagWrapperList.Add(New TagWrapper("t5", "栏位说明", " ", 1, 0, FormatterFactory.getInstance().getRBlankFormatter()))
     tagWrapperList.Add(New TagWrapper("t6", "栏位说明", "0000000", 7, 0, FormatterFactory.getInstance().getYearMonthDateFormatter()))
     tagWrapperList.Add(New TagWrapper("t7", "栏位说明", "000000", 6, 0, FormatterFactory.getInstance().getRZeroFormatter()))
     tagWrapperList.Add(New TagWrapper("t8", "栏位说明", "0000000000", 10, 0, FormatterFactory.getInstance().getRZeroFormatter()))
     tagWrapperList.Add(New TagWrapper("t9", "栏位说明", "000000", 6, 0, FormatterFactory.getInstance().getRZeroFormatter()))
     tagWrapperList.Add(New TagWrapper("t10", "栏位说明", "0000000000", 10, 0, FormatterFactory.getInstance().getRZeroFormatter()))
     tagWrapperList.Add(New TagWrapper("t11", "栏位说明", "000000", 6, 0, FormatterFactory.getInstance().getRZeroFormatter()))
     tagWrapperList.Add(New TagWrapper("t12", "栏位说明", "0000000000", 10, 0, FormatterFactory.getInstance().getRZeroFormatter()))
     tagWrapperList.Add(New TagWrapper("t13", "栏位说明", "000000", 6, 0, FormatterFactory.getInstance().getRZeroFormatter()))
End Sub

Public Sub close() Implements Processor.close
     If Not (sw Is Nothing) Then
          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) <> 0) Then
          Return False
     End If

     If (String.Compare(tagStack.Peek, "tdata") = 0 And String.Compare(tagName, tagStack.Peek) = 0) Then
          tagStack.Pop()
          flush()
     ElseIf (valueStack.Count <> 0 And String.Compare(tagStack.Peek, tagName) = 0) Then
          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
 

 

  • 大小: 8.3 KB
  • 大小: 11.3 KB
分享到:
评论

相关推荐

    quickfast_win_src_1_5_0.zip

    在证券市场,Level-2行情提供了比普通Level-1更详细、更实时的数据,包括买卖五档报价、逐笔成交等深度信息。这个压缩包"quickfast_win_src_1_5_0.zip"包含了QuickFast库的Windows平台源代码版本1.5.0。 QuickFast...

    图解Win7和Oracle11g兼容性的解决方法.docx

    本文档通过修改Oracle 11g安装包中的`refhost.xml`文件来解决这一问题,并详细介绍了整个安装过程。 #### 安装前准备 在开始安装之前,请确保已经准备好以下资源: 1. **Oracle 11g Enterprise Edition 安装包**:...

    xerces-c-src-2-8-0安装&amp;开发文档.docx

    本文档主要介绍如何安装Xerces-C++ 2.8.0版本以及进行相关的开发工作。 ### 一、安装 1. **下载**:首先,你需要从Xerces-C++的官方网站或镜像站点下载源代码包`xerces-c-src-2_8_0.tar.gz`。下载完成后,将其解...

    oracle db常用sql命令

    - **相关文档**: 本文档基于 Oracle 11g R2 版本编写,适用于 Oracle 11g 及以上版本数据库。 #### 2. 常用 SQL 命令 ##### 2.1 字符转换 - **函数**: `CONVERT(char, dest_char_set[, source_char_set])` - **...

    SSM框架-详细整合教程 (2).pdf

    **1. Spring框架** Spring是一个轻量级的Java开发框架,起源于2003年,旨在简化企业级应用的复杂性。它通过控制反转(IoC)和面向切面编程(AOP)来管理对象的生命周期和依赖关系。Spring提供了多种功能,包括数据...

    BestPractices_ASM_01_2009.pdf

    - **Oracle 11g R1 ASM 新特性**:虽然本文档主要关注的是 10g R2 版本,但了解 11g R1 中 ASM 的新特性也非常重要,这些新特性进一步增强了 ASM 的功能和灵活性。 - **性能与可扩展性**:ASM 在这两个方面都有显著...

    openwrt,Lede深入学习笔记v2.0.pdf

    root@zjh-vm:/home/work# apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext ``` 这些软件包的安装是为后续构建过程中的依赖关系做准备。如`libssl-dev`用于支持SSL...

    EA帮助文档翻译(数据建模)1.0.doc

    本文档主要介绍了如何使用EA进行数据建模,特别强调了数据库相关的概念和技术。 #### 二、使用EA进行数据建模 ##### 1. 数据建模概述 - **数据建模**是在EA中构建和维护数据库设计的过程。通过数据建模,用户能够...

    linux下poi读取word空指针异常问题解决

    该问题的解决过程耗时较长,因此希望通过本文档帮助遇到类似问题的技术人员能够快速定位并解决此问题。 #### 错误示例 根据提供的部分代码片段和日志信息,可以推测出以下错误场景: ```java // 假设代码片段 ...

    NINJA V单页.pdf

    1. NINJA V设备特点:NINJA V是一款专门针对无反/单反相机和游戏录制场景设计的设备,它具有轻巧便携的特性,仅重350g,配置了5.2英寸的HDR监视器,支持高达4K60p10bit的视频录制,亮度达到1000尼特。 2. HDR视频...

    3G门户业务技术要求(修改).pdf

    本文档主要涵盖了业务技术要求、页面开发规范等方面,适用于3G门户服务的开发、运营和维护人员。 1. 概述 文档内容主要涉及3G门户业务的通用技术需求和业务流程,包括业务的访问、订购流程以及页面开发的各项准则。...

    互联网项目的技术选择与应用.pdf

    【描述】:本文档主要探讨了在构建互联网项目时的技术选择,包括各种编程语言、数据库和服务器技术,以及新兴技术的应用和选择策略。 【标签】:CS(计算机科学) 【内容】: 1. 技术是基础 互联网项目的成功不...

    方正翔宇内容管理安装手册

    本文档主要介绍了系统的基本信息、安装前的准备、具体安装步骤以及后期的配置方法。 #### 二、操作系统要求 **1.1 硬件环境要求** 在安装方正翔宇网站内容管理系统之前,需要确保服务器满足以下硬件配置要求: -...

    C#从入门到精通(第5版)PPT电子课件(可供教学参考).7z

    1. **基础语法**:首先,C#的基础包括变量、数据类型、运算符、流程控制(如条件语句和循环结构)、数组和集合等。这些内容构成了程序的基本骨架,是编写任何代码的起点。 2. **类与对象**:作为面向对象的语言,C#...

    Java练习题集合7

    **1. 题目解析** 题目描述了一个简单的Java程序,其中定义了一个名为`Test`的类,该类包含一个静态整型变量`x`,并在`main`方法中尝试输出变量`x`的值。 **选项分析** - **A. "Valueis0"被打印输出。** 正确选项。...

    pl/sql developer 9.0中文版帮助文档(有书签)

    - 支持对 Oracle 10g 中新增的 XMLTYPE 数据类型进行操作。 - 可以直接编辑 XML 数据。 **7.8 直接查询导出** - 将查询结果直接导出到外部文件。 - 支持多种文件格式。 **7.9 保存 SQL 脚本** - 可以将常用的 SQL ...

Global site tag (gtag.js) - Google Analytics