代码如下: '*********************以下定义一些自己的数据类型,用于信息存放********************* '定义笔划 Public Type UsysStroke ID As Long '笔划编号 Color As Long '笔划颜色 LineWidth As Long '笔划宽度 x() As Single '横坐标数组 y() As Single '纵坐标数组 Force() As Byte '压力数组 DeltaTime() As Long '时间间隔数组 End Type '定义字符 Public Type UsysChar ID As Long '字符编号 Content As String '识别结果 PossibleCharsCount As Long '识别后返回相近字符的个数 StrokesCount As Long '该字符中笔划的数目 Left As Single '字符笔划集合的左边界 Top As Single '字符笔划集合的上边界 Height As Single '字符笔划集合的高度 Width As Single '字符笔划集合的宽度 PossibleChars() As String '返回的相近字符数组 PenStroke() As UsysStroke '笔划数组 End Type '定义行 Public Type UsysLine ID As Long '行编号 CharsCount As Long '行中字的个数 Char() As UsysChar '行中所包含的字数组 End Type '定义Area Public Type UsysArea Name As String 'UserArea名称 LinesCount As Long 'Area中书写的行数 Uline() As UsysLine '行数组**注意由于关键字的影响,此处的命名和XML文件中不同 End Type '定义Page页 Public Type UsysPage ID As Long '页编号 PageAddress As String '页地址 AreasCount As Long '页中包含的UserArea数目 UserArea() As UsysArea 'Area数组 End Type '定义Request Public Type UsysRequest Count As Long '所包含页的数目 Page() As UsysPage '页数组 End TypePublic Function ReadXML(FileName As String) As UsysRequest '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '本函数读取用于校验的XML文档,并将其中的数据存储成自己定义的数据结构UsysRequest '参数FileName为校验组件输入XML文档的路径及文件名 ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '下面定义一些用于循环控制的整型变量 Dim i As Long '用于控制循环 Dim j As Long '用于控制循环 Dim h As Long '用于控制循环 Dim l As Long '用于控制循环 Dim m As Long '用于控制循环 i = 0 '赋初值 j = 0 '赋初值 h = 0 '赋初值 l = 0 '赋初值 m = 0 '赋初值
'下面定义一些用于操作XML元素的变量 Dim objXML As New DOMDocument '声明并实例化 Dim PagesNode As IXMLDOMElement '根元素 Dim PageNode As IXMLDOMElement 'Page元素 Dim UserAreaNode As IXMLDOMElement 'UserArea元素 Dim ULineNode As IXMLDOMElement 'Line元素,注意名称和XML文档中不同 Dim CharNode As IXMLDOMElement 'Char元素 Dim PenStrokeNode As IXMLDOMElement 'PenStroke元素
'以下是用层层嵌套的循环读取出XML文档中的内容,并转存成UsysRequest结构 objXML.Load FileName '打开XML文档 If objXML.documentElement Is Nothing Then '如果指定的XML文件不存在 MsgBox " 指定的XML文件不存在!", vbOKOnly, "提示:" Exit Function End If Set PagesNode = objXML.documentElement '获取根元素 Dim Request As UsysRequest '自己定义的UsysRequest结构 Request.Count = CLng(PagesNode.getAttribute("Count")) Dim Page() As UsysPage For Each PageNode In PagesNode.selectNodes("./Page") ReDim Preserve Page(i) Page(i).ID = CLng(PageNode.getAttribute("id")) Page(i).PageAddress = Trim(PageNode.getAttribute("PageAddress")) Page(i).AreasCount = CLng(PageNode.getAttribute("AreasCount")) Dim UserArea() As UsysArea j = 0 '注意在下一个Page的循环过程前归零 ReDim UserArea(j) '清空 For Each UserAreaNode In PageNode.selectNodes("./UserArea") ReDim Preserve UserArea(j) UserArea(j).Name = Trim(UserAreaNode.getAttribute("Name")) UserArea(j).LinesCount = CLng(UserAreaNode.getAttribute("LinesCount")) Dim Uline() As UsysLine h = 0 '注意在下一个Area的循环过程前归零 ReDim Uline(h) '清空 For Each ULineNode In UserAreaNode.selectNodes("./Line") ReDim Preserve Uline(h) Uline(h).ID = CLng(ULineNode.getAttribute("id")) Uline(h).CharsCount = CLng(ULineNode.getAttribute("CharsCount")) Dim Char() As UsysChar l = 0 '注意在下一个行的循环过程前归零 ReDim Char(l) '清空 For Each CharNode In ULineNode.selectNodes("./Char") ReDim Preserve Char(l) Char(l).ID = CLng(CharNode.getAttribute("id")) Char(l).Left = CSng(CharNode.getAttribute("Left")) Char(l).Top = CSng(CharNode.getAttribute("Top")) Char(l).Height = CSng(CharNode.getAttribute("Height")) Char(l).Width = CSng(CharNode.getAttribute("Width")) Char(l).Content = Trim(CharNode.getAttribute("Content")) Char(l).PossibleCharsCount = CLng(CharNode.getAttribute("PossibleCharsCount")) Dim txtChars As String txtChars = CharNode.selectSingleNode("./PossibleChars").Text Char(l).PossibleChars = GetStr(txtChars) Char(l).StrokesCount = CLng(CharNode.getAttribute("StrokesCount")) Dim PenStroke() As UsysStroke m = 0 '注意在下一个字的循环过程前归零 ReDim PenStroke(m) '清空 For Each PenStrokeNode In CharNode.selectNodes("./PenStroke") ReDim Preserve PenStroke(m) PenStroke(m).ID = CLng(PenStrokeNode.getAttribute("id")) PenStroke(m).Color = CLng(PenStrokeNode.getAttribute("Color")) PenStroke(m).LineWidth = CLng(PenStrokeNode.getAttribute("LineWidth")) Dim txt As String txt = PenStrokeNode.selectSingleNode("./X").Text PenStroke(m).x = GetSingle(txt) txt = PenStrokeNode.selectSingleNode("./Y").Text PenStroke(m).y = GetSingle(txt) txt = PenStrokeNode.selectSingleNode("./Force").Text PenStroke(m).Force = GetByte(txt) txt = PenStrokeNode.selectSingleNode("./DeltaTime").Text PenStroke(m).DeltaTime = GetLong(txt) m = m + 1 Next Char(l).PenStroke = PenStroke() l = l + 1 Next Uline(h).Char = Char() h = h + 1 Next UserArea(j).Uline = Uline() j = j + 1 Next Page(i).UserArea = UserArea() i = i + 1 Next Request.Page = Page() '释放内存 Set PenStrokeNode = Nothing Set CharNode = Nothing Set ULineNode = Nothing Set UserAreaNode = Nothing Set PageNode = Nothing Set PagesNode = Nothing Set objXML = Nothing
ReadXML = Request '返回值 End Function有一些用于数据转换的函数没有贴出代码,不过整个流程框架就是这个样子了。
<?xml version="1.0" encoding="GB2312" ?>
- <Pages Count="2">
- <Page id="0" PageAddress="35.38.3.0" AreasCount="1">
- <UserArea Name="sign" LinesCount="1">
- <Line id="0" CharsCount="2">
- <Char id="0" Content="1" PossibleCharsCount="2" StrokesCount="1" Left="1" Top="1" Height="49" Width="49">
<PossibleChars>一,7,</PossibleChars>
- <PenStroke id="0" Color="0" LineWidth="1">
<X>10,20,30,40,</X>
<Y>20,20,20,20,</Y>
<DeltaTime>0,100,100,100,</DeltaTime>
<Force>100,100,100,100,</Force>
</PenStroke>
</Char>
- <Char id="1" Content="2" PossibleCharsCount="3" StrokesCount="2" Left="51" Top="1" Height="49" Width="49">
<PossibleChars>十,t,4,</PossibleChars>
- <PenStroke id="0" Color="0" LineWidth="1">
<X>60,70,80,90,</X>
<Y>20,20,20,20,</Y>
<DeltaTime>0,100,100,100,</DeltaTime>
<Force>100,100,100,100,</Force>
</PenStroke>
- <PenStroke id="1" Color="0" LineWidth="1">
<X>70,70,70,70,</X>
<Y>10,20,30,40,</Y>
<DeltaTime>0,50,50,50,</DeltaTime>
<Force>100,100,100,100,</Force>
</PenStroke>
</Char>
</Line>
</UserArea>
</Page>
- <Page id="1" PageAddress="35.38.3.1" AreasCount="1">
- <UserArea Name="sign" LinesCount="1">
- <Line id="0" CharsCount="2">
- <Char id="0" Content="1" PossibleCharsCount="2" StrokesCount="1" Left="1" Top="1" Height="49" Width="49">
<PossibleChars>一,7,</PossibleChars>
- <PenStroke id="0" Color="0" LineWidth="1">
<X>10,20,30,40,</X>
<Y>20,20,20,20,</Y>
<DeltaTime>0,100,100,100,</DeltaTime>
<Force>100,100,100,100,</Force>
</PenStroke>
</Char>
- <Char id="1" Content="2" PossibleCharsCount="3" StrokesCount="2" Left="51" Top="1" Height="49" Width="49">
<PossibleChars>十,t,4,</PossibleChars>
- <PenStroke id="0" Color="0" LineWidth="1">
<X>60,70,80,90,</X>
<Y>20,20,20,20,</Y>
<DeltaTime>0,100,100,100,</DeltaTime>
<Force>100,100,100,100,</Force>
</PenStroke>
- <PenStroke id="1" Color="0" LineWidth="1">
<X>70,70,70,70,</X>
<Y>10,20,30,40,</Y>
<DeltaTime>0,50,50,50,</DeltaTime>
<Force>100,100,100,100,</Force>
</PenStroke>
</Char>
</Line>
</UserArea>
</Page>
</Pages>
'*********************以下定义一些自己的数据类型,用于信息存放*********************
'定义笔划
Public Type UsysStroke
ID As Long '笔划编号
Color As Long '笔划颜色
LineWidth As Long '笔划宽度
x() As Single '横坐标数组
y() As Single '纵坐标数组
Force() As Byte '压力数组
DeltaTime() As Long '时间间隔数组
End Type
'定义字符
Public Type UsysChar
ID As Long '字符编号
Content As String '识别结果
PossibleCharsCount As Long '识别后返回相近字符的个数
StrokesCount As Long '该字符中笔划的数目
Left As Single '字符笔划集合的左边界
Top As Single '字符笔划集合的上边界
Height As Single '字符笔划集合的高度
Width As Single '字符笔划集合的宽度
PossibleChars() As String '返回的相近字符数组
PenStroke() As UsysStroke '笔划数组
End Type
'定义行
Public Type UsysLine
ID As Long '行编号
CharsCount As Long '行中字的个数
Char() As UsysChar '行中所包含的字数组
End Type
'定义Area
Public Type UsysArea
Name As String 'UserArea名称
LinesCount As Long 'Area中书写的行数
Uline() As UsysLine '行数组**注意由于关键字的影响,此处的命名和XML文件中不同
End Type
'定义Page页
Public Type UsysPage
ID As Long '页编号
PageAddress As String '页地址
AreasCount As Long '页中包含的UserArea数目
UserArea() As UsysArea 'Area数组
End Type
'定义Request
Public Type UsysRequest
Count As Long '所包含页的数目
Page() As UsysPage '页数组
End TypePublic Function ReadXML(FileName As String) As UsysRequest
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'本函数读取用于校验的XML文档,并将其中的数据存储成自己定义的数据结构UsysRequest
'参数FileName为校验组件输入XML文档的路径及文件名
'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'下面定义一些用于循环控制的整型变量
Dim i As Long '用于控制循环
Dim j As Long '用于控制循环
Dim h As Long '用于控制循环
Dim l As Long '用于控制循环
Dim m As Long '用于控制循环
i = 0 '赋初值
j = 0 '赋初值
h = 0 '赋初值
l = 0 '赋初值
m = 0 '赋初值
'下面定义一些用于操作XML元素的变量
Dim objXML As New DOMDocument '声明并实例化
Dim PagesNode As IXMLDOMElement '根元素
Dim PageNode As IXMLDOMElement 'Page元素
Dim UserAreaNode As IXMLDOMElement 'UserArea元素
Dim ULineNode As IXMLDOMElement 'Line元素,注意名称和XML文档中不同
Dim CharNode As IXMLDOMElement 'Char元素
Dim PenStrokeNode As IXMLDOMElement 'PenStroke元素
'以下是用层层嵌套的循环读取出XML文档中的内容,并转存成UsysRequest结构
objXML.Load FileName '打开XML文档
If objXML.documentElement Is Nothing Then '如果指定的XML文件不存在
MsgBox " 指定的XML文件不存在!", vbOKOnly, "提示:"
Exit Function
End If
Set PagesNode = objXML.documentElement '获取根元素
Dim Request As UsysRequest '自己定义的UsysRequest结构
Request.Count = CLng(PagesNode.getAttribute("Count"))
Dim Page() As UsysPage
For Each PageNode In PagesNode.selectNodes("./Page")
ReDim Preserve Page(i)
Page(i).ID = CLng(PageNode.getAttribute("id"))
Page(i).PageAddress = Trim(PageNode.getAttribute("PageAddress"))
Page(i).AreasCount = CLng(PageNode.getAttribute("AreasCount"))
Dim UserArea() As UsysArea
j = 0 '注意在下一个Page的循环过程前归零
ReDim UserArea(j) '清空
For Each UserAreaNode In PageNode.selectNodes("./UserArea")
ReDim Preserve UserArea(j)
UserArea(j).Name = Trim(UserAreaNode.getAttribute("Name"))
UserArea(j).LinesCount = CLng(UserAreaNode.getAttribute("LinesCount"))
Dim Uline() As UsysLine
h = 0 '注意在下一个Area的循环过程前归零
ReDim Uline(h) '清空
For Each ULineNode In UserAreaNode.selectNodes("./Line")
ReDim Preserve Uline(h)
Uline(h).ID = CLng(ULineNode.getAttribute("id"))
Uline(h).CharsCount = CLng(ULineNode.getAttribute("CharsCount"))
Dim Char() As UsysChar
l = 0 '注意在下一个行的循环过程前归零
ReDim Char(l) '清空
For Each CharNode In ULineNode.selectNodes("./Char")
ReDim Preserve Char(l)
Char(l).ID = CLng(CharNode.getAttribute("id"))
Char(l).Left = CSng(CharNode.getAttribute("Left"))
Char(l).Top = CSng(CharNode.getAttribute("Top"))
Char(l).Height = CSng(CharNode.getAttribute("Height"))
Char(l).Width = CSng(CharNode.getAttribute("Width"))
Char(l).Content = Trim(CharNode.getAttribute("Content"))
Char(l).PossibleCharsCount = CLng(CharNode.getAttribute("PossibleCharsCount"))
Dim txtChars As String
txtChars = CharNode.selectSingleNode("./PossibleChars").Text
Char(l).PossibleChars = GetStr(txtChars)
Char(l).StrokesCount = CLng(CharNode.getAttribute("StrokesCount"))
Dim PenStroke() As UsysStroke
m = 0 '注意在下一个字的循环过程前归零
ReDim PenStroke(m) '清空
For Each PenStrokeNode In CharNode.selectNodes("./PenStroke")
ReDim Preserve PenStroke(m)
PenStroke(m).ID = CLng(PenStrokeNode.getAttribute("id"))
PenStroke(m).Color = CLng(PenStrokeNode.getAttribute("Color"))
PenStroke(m).LineWidth = CLng(PenStrokeNode.getAttribute("LineWidth"))
Dim txt As String
txt = PenStrokeNode.selectSingleNode("./X").Text
PenStroke(m).x = GetSingle(txt)
txt = PenStrokeNode.selectSingleNode("./Y").Text
PenStroke(m).y = GetSingle(txt)
txt = PenStrokeNode.selectSingleNode("./Force").Text
PenStroke(m).Force = GetByte(txt)
txt = PenStrokeNode.selectSingleNode("./DeltaTime").Text
PenStroke(m).DeltaTime = GetLong(txt)
m = m + 1
Next
Char(l).PenStroke = PenStroke()
l = l + 1
Next
Uline(h).Char = Char()
h = h + 1
Next
UserArea(j).Uline = Uline()
j = j + 1
Next
Page(i).UserArea = UserArea()
i = i + 1
Next
Request.Page = Page() '释放内存
Set PenStrokeNode = Nothing
Set CharNode = Nothing
Set ULineNode = Nothing
Set UserAreaNode = Nothing
Set PageNode = Nothing
Set PagesNode = Nothing
Set objXML = Nothing
ReadXML = Request '返回值
End Function有一些用于数据转换的函数没有贴出代码,不过整个流程框架就是这个样子了。