- 浏览: 111652 次
文章分类
最新评论
-
luotianwen456123:
文件大小有限制吗
ActiveMQ之三 -- 使用ActiveMQ来传送文件 -
hotbain:
谢谢分享,值得收藏。又学了好多啊!
ActiveMQ之三 -- 使用ActiveMQ来传送文件
问题:
存在一个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)
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()
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
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
相关推荐
在证券市场,Level-2行情提供了比普通Level-1更详细、更实时的数据,包括买卖五档报价、逐笔成交等深度信息。这个压缩包"quickfast_win_src_1_5_0.zip"包含了QuickFast库的Windows平台源代码版本1.5.0。 QuickFast...
本文档通过修改Oracle 11g安装包中的`refhost.xml`文件来解决这一问题,并详细介绍了整个安装过程。 #### 安装前准备 在开始安装之前,请确保已经准备好以下资源: 1. **Oracle 11g Enterprise Edition 安装包**:...
本文档主要介绍如何安装Xerces-C++ 2.8.0版本以及进行相关的开发工作。 ### 一、安装 1. **下载**:首先,你需要从Xerces-C++的官方网站或镜像站点下载源代码包`xerces-c-src-2_8_0.tar.gz`。下载完成后,将其解...
- **相关文档**: 本文档基于 Oracle 11g R2 版本编写,适用于 Oracle 11g 及以上版本数据库。 #### 2. 常用 SQL 命令 ##### 2.1 字符转换 - **函数**: `CONVERT(char, dest_char_set[, source_char_set])` - **...
**1. Spring框架** Spring是一个轻量级的Java开发框架,起源于2003年,旨在简化企业级应用的复杂性。它通过控制反转(IoC)和面向切面编程(AOP)来管理对象的生命周期和依赖关系。Spring提供了多种功能,包括数据...
- **Oracle 11g R1 ASM 新特性**:虽然本文档主要关注的是 10g R2 版本,但了解 11g R1 中 ASM 的新特性也非常重要,这些新特性进一步增强了 ASM 的功能和灵活性。 - **性能与可扩展性**:ASM 在这两个方面都有显著...
root@zjh-vm:/home/work# apt-get install subversion build-essential libncurses5-dev zlib1g-dev gawk git ccache gettext ``` 这些软件包的安装是为后续构建过程中的依赖关系做准备。如`libssl-dev`用于支持SSL...
本文档主要介绍了如何使用EA进行数据建模,特别强调了数据库相关的概念和技术。 #### 二、使用EA进行数据建模 ##### 1. 数据建模概述 - **数据建模**是在EA中构建和维护数据库设计的过程。通过数据建模,用户能够...
该问题的解决过程耗时较长,因此希望通过本文档帮助遇到类似问题的技术人员能够快速定位并解决此问题。 #### 错误示例 根据提供的部分代码片段和日志信息,可以推测出以下错误场景: ```java // 假设代码片段 ...
1. NINJA V设备特点:NINJA V是一款专门针对无反/单反相机和游戏录制场景设计的设备,它具有轻巧便携的特性,仅重350g,配置了5.2英寸的HDR监视器,支持高达4K60p10bit的视频录制,亮度达到1000尼特。 2. HDR视频...
本文档主要涵盖了业务技术要求、页面开发规范等方面,适用于3G门户服务的开发、运营和维护人员。 1. 概述 文档内容主要涉及3G门户业务的通用技术需求和业务流程,包括业务的访问、订购流程以及页面开发的各项准则。...
【描述】:本文档主要探讨了在构建互联网项目时的技术选择,包括各种编程语言、数据库和服务器技术,以及新兴技术的应用和选择策略。 【标签】:CS(计算机科学) 【内容】: 1. 技术是基础 互联网项目的成功不...
本文档主要介绍了系统的基本信息、安装前的准备、具体安装步骤以及后期的配置方法。 #### 二、操作系统要求 **1.1 硬件环境要求** 在安装方正翔宇网站内容管理系统之前,需要确保服务器满足以下硬件配置要求: -...
1. **基础语法**:首先,C#的基础包括变量、数据类型、运算符、流程控制(如条件语句和循环结构)、数组和集合等。这些内容构成了程序的基本骨架,是编写任何代码的起点。 2. **类与对象**:作为面向对象的语言,C#...
**1. 题目解析** 题目描述了一个简单的Java程序,其中定义了一个名为`Test`的类,该类包含一个静态整型变量`x`,并在`main`方法中尝试输出变量`x`的值。 **选项分析** - **A. "Valueis0"被打印输出。** 正确选项。...
- 支持对 Oracle 10g 中新增的 XMLTYPE 数据类型进行操作。 - 可以直接编辑 XML 数据。 **7.8 直接查询导出** - 将查询结果直接导出到外部文件。 - 支持多种文件格式。 **7.9 保存 SQL 脚本** - 可以将常用的 SQL ...