毕业论文(国际货运单证确认系统)_第1页
毕业论文(国际货运单证确认系统)_第2页
毕业论文(国际货运单证确认系统)_第3页
毕业论文(国际货运单证确认系统)_第4页
毕业论文(国际货运单证确认系统)_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、国际货运单证确认系统国际货运单证确认系统【摘摘 要要】采用 EDI 的方法能快速、节省又安全地发送订单、发票、提货单等商业信息。国际货运单证确认系统以通用 WEB 数据交换系统为基础,是整个 EDI 系统中非常重要的一个业务模块之一,它提供货主与货代之间对单证的管理,主要包括单证的确认操作,比对操作和修改操作,快速实现货主与货代在无纸条件下的的的各项业务需求。【关键字关键字】EDI、XML、XSLT、DOM 【AbstractAbstract】 InternationalInternational FreightFreight DocumentDocument CheckCheck Syste

2、mSystemEDI is an important means of participating in the International trade currently. We can send order form, invoice, bill of lading or other commercial information quickly and safely by using EDI . International Freight Document Check System which based on General WEB data change system, is an o

3、peration function module of EDI system. It provides Document management between merchant and agent ,which includes Document checking ,Document comparing and Document modifying, and realizing every operation demand immediately in no page condition.The International Freight Document Check System which

4、 is designed by Delphi,sets XML as its exploiture Object and combines Delphi with XML to achieve its design aim ,is one of the most important operation module in the whole EDI system. (请你自己按中文修改)(请你自己按中文修改) 【KeyKey WordsWords】XML、XMLT、Delphi、DOM目录目录第一章综 述.5第二章 设计原理和知识.72.1 XML 原理 .7介绍.7介绍.7的介绍.102.2

5、 ADO 原理 .112.3 DELPHI 介绍 .11对 XML 的支持.12对 ADO 的支持.122.4 COM 技术应用 .13第三章 系统原理.153.1 单证确认系统设计框架图:.153. 2 系统功能简介.163.3 功能模块设计原理与方法.16界面管理功能.16单证生成功能.17自动比对功能模块.17同步功能模块探讨.19报文回复与接收端自动检测功能.19单证修改模块.20第四章 核心代码分析及系统实现技术要点.234.1 XSL 转换 XML .234.2 字符串搜寻.234.3 报文的合并与拆分.24报文合并.25报文的拆分.254.4 对 XML 报文的中间部分截断.27

6、4.5 单证的修改回复 .28从 ListBox 与 Memo 之间索引的建立.28字符串对字符的分解.284.5.3 XML 在 Delphi 里 DOM 中的装载与修改 .284.6 节点内容比对.28临时文件的生成.284.5.2 对节点内容的比对.284.6 文件转为字符串的处理.29第五章 系统评测.315.1 系统测试环境 .315.2 测试对象与功能 .315.3 存在的问题及改进.315.4 综合评价和结论.31参考文献.33致谢.33附录一 EN 报文与 EN.XSL 报文(BL 与 BL.XSL 类似).34附录二 节点读取函数.48第一章第一章 综综 述述EDI(Elec

7、tronic Data Interchange)是指具有一定结构特征的数据信息在计算机应用系统之间的自动交换和处理。这是当今参与国际贸易的重要手段,许多行业采用 EDI 的方法来快速、节省又安全地发送订单、发票、提货单、 海关申报单、进出口许可证等商业信息。宁波是一个港口城市,国际运输和现代物流已变成宁波国民经济的重要组成部分。宁波港也将成为具备运输、仓储、中转、工业开发、通信信息、现代物流、战略储备、滚装运输、保税及综合服务功能于一体的现代化、多功能的港口。 宁波港口 EDI 中心积极探索实现集装箱运输无纸化,提供电子数据交换,在港关、港检联动方面作了有益的尝试、提高了港口工作效率和服务水平

8、。建立以国际物流 EDI 为中心的标准化接口体系,进行市场经营性的信息资源服务进一步尝试,鼓励第三方 EDI 开发商进行共同开发,基于 EDI 体系的物流信息服务正逐渐在经济领域发挥关键的作用。Web-EDI 的目标是允许中小企业只需通过浏览器和 Internet 连接去执行 EDI 交换。Web 是 EDI 消息的接口,表单就是 EDI 系统的接口。这种解决方案对中小企业来说只需一个浏览器和 Internet 连接就可完成。国际货运单证确认系统是在前期 EDI 分布式开发平台上的一个业务应用系统。它提供给货代的业务系统一个功能接口,可以发送相应阶段的单证( 、MAIL、系统)给客户,也允许用

9、户以 、邮件、客户端、网站方式接收这些相应阶段的单证,允许货主对这些加以确认(包括拒绝和修改)回执或提供重复发送和二次确认的同步修改等。通过该单证确认系统,可以快速实现货代和货主间的各项业务需求。Web Service (WebServer) 用 户 2 用 户 1 封装好的MIDAS 接口SQL 后台数据库(DBserver)用户(类别、公司、部门、人员四级)及计费、费率、报文格式、加解密算法、业务、发送授权(收发业务) 、发送队列、接收队列、日志、历史报文(成功、垃圾) 发送 队列 接收 队列 监控、管理、计费 加解密算法/转换算法/调度算法 发送、接收、查询、注册、注销、管理、监控(提供

10、给用户封装好的方法) 并能对不同的用户提供不同的服务。第二章第二章 设计原理设计原理2.12.1 XMLXML 原理原理可扩展标记语言(eXtensible Makup Language ,XML)是由万维网联盟(World Wide Web Consortium,W3C)开发的,主要目的是为了克服HTML 的缺点。它是 SGML(Standard Generalized Markup Language)的一个子集,其目标是能够以目前 HTML 可能实现的方式在 Web 上使用、接受、和处理通用 SGML。XML 实际上是一种规范,它的语言语法简洁,书写格式严谨。(1)XML 语言区分大小写;

11、(2)XML 文档通常以一个 XML 声明开始,声明格式如下:(3)XML 文档包含一个或多个元素。元素是文档的主要逻辑组件,它由开始标记和结束标记界定。每个元素都有一个用于标识的名字,名字必须以一个字母或下划线开始,后跟字母、数字、连字符、下划线或圆点。但“XML”以及包括各种大小写的任意组合形式,如“xML” 、 “Xml” 、 “xml”等,都是系统保留字,不能命名为元素名称。元素中可以包含属性,为元素提供附加信息。一个具有属性的元素,其表示形式如下:元素内容 (4)XML 的注释,使用“”将他们包含起来。注释是给人工阅读使用的,XML 解析器会忽略注释。(1)树型结构每个结构完整的 X

12、ML 文档都是树型结构,树型结构的节点是元素以及元素的内容。在 XSL 中,特性、名称空间、处理指令以及注释等也可当作节点。XSL 处理器认为 XML 树型结构包含根节点、元素、名称空间、处理指令以及注释等 7 类节点。(2)XSL 样式单文档XSL 样式单包含一组模板和其他规则。模板规则拥有模式(Pattern)以及模式(Template) ,模式用来指定模板规则所适用的树型结构,而模板用来在与模式匹配时进行输出。当 XSL 处理器使用 XSL 样式单来格式化XML 文档时,它对 XML 文档的树型结构依次进行扫描,浏览每个树型结构,当读完 XML 文档中的每个树型结构时,处理器就把它与样式

13、单中每个模板规则的模式进行比较。当处理器找到与模板规则的模式相匹配的树型结构时,它就输出此规则的模板。这个模板包括一些标记,新的数据和从原XML 文档的树型结构复制来的数据。(3)XSL 样式单和 XML 文档的链接将 XSL 样式单和 XML 文档相链接后,就可用浏览器显示 XML 文件。这种链接通过在 XML 文档序码的 XML 声明后插入处理指令完成,其语法格式为: (4)XSL 模板由 XSL:template 元素定义的模板规则是 XSL 样式单的最重要部分,每个模板规则都有一个 XSL:template 元素。每个 XSL:template 元素都有一个 match 属性(Attr

14、ibute) ,用来指定此模板应用于输入文档的哪个节点。下面分类介绍这些模板规则:a.xsl:apply-template 元素:要求处理器去处理已经用 xsl-template 元素定义的命名元素。b.select 属性:语句是对当前节点下所有节点进行嵌套检索,而 select 属性用来指定要选定的子元素。如:表示只对子元素Title 和 Author 执行操作(5)在 XSL 中对节点值的简单操作a. xsl:value-of 元素:该元素可以把输入文档中的节点值复制到输出文档中,xsl:value-of 元素的 select 属性值指定要获取的是哪个节点的值。如:表示选择所有的子元素。b

15、. xsl:for-each 元素:该元素能处理多个元素。c. order-by 属性:在模板中的 xsl:apply-templates 元素中加入order-by 属性对指定的节点按照给定的次序进行排序输出,其语法格式为:(6)节点的匹配模式匹配根模式:为了使输出的文档结构完整,从 XSL 变换的第一个输出内容应为输入文档的根节点。例如下面的语句,只能应用与根节点:a匹配元素名:将根匹配模式中的“/”改为元素名,就可以表示为对元素的匹配了,另外 select 属性的描述完成对元素的筛选,下面是建立一个用来输出 ParentElement 元素的 ChildElement 子元素其标题为粗体

16、的模板的例子: b使用“/”字符匹配子节点:在 XSL 中允许用 Xpath 来寻址 XML文档中的节点。一个基本的 Xpath 表达式如下:在这个表达式中通过使用“/”得到 descentdant 这个节点从根节点开始的路径。c使用“/”符号匹配子元素:当使用不规则的层次时,很难描述其层次关系,选择给定类型的所有子元素,可使用“/”引用任意级别的后代元素。d使用“”符号匹配属性如:也可使用“*”来选择元素的所有属性。如/Item/*可选 Item 元素的所有属性。 e使用 comment()匹配注释f使用 text()匹配文本节点g“或”操作符(|):允许一条模板规则匹配多种模式。如下面的模

17、板规则与 ID 和 Name 元素都匹配:h(7) 条件模板a 条件表达式比较运算符可选方式描述And$and$逻辑与Or&or&逻辑或Not()$not$逻辑非b 在摸板输出中使用条件1. xsl: if 元素 如下面的摸板规则将在输出不是最后一个节点的后面加上一个逗号,2. xsl:choose 元素xsl:choose 元素可以从几个可能的输出结果中选择一个,它的子元素 xsl:when 提供各种条件以其相关的输出模板。Xsl:when 元素的 test 属性值是布尔值的表达式结果,如果多个条件为 true,那么只选择第一个为 true 的条件;如果都不为 true,则选择xsl:oth

18、erwise 子元素的内容。如下例子根据 Item 元素的子元素的名称设置颜色:.c 在模板属性中使用条件在样式单中,使用如下语句:这就是一个在属性中使用条件,Age 属性小于 28 的所有 Member (1)XMLDOMDocument 对象XMLDOMDocument 对象代表 XML 文档的根,它是 XML 文档的第一个调用接口,也是唯一可以被创建的对象。 XMLDOMDocument 对象的常用属性属性用法DocumentElement返回文档的根节点FirstChild返回文档的第一个子节点LastChild返回文档的最后一个子节点Text返回节点的文字内容和它的子树(2)XMLD

19、OMNode 对象这是 DOM 的基本对象之一,该对象在 XML 文件树中表示一个节点。XMLDOMNode 对象的主要属性属性用法NodeName返回节点的名字NodeType返回节点类型ChildNode返回节点的子节点列表ParentNode返回节点的父节点列表PreviousSibling返回节点的前一个兄弟节点NextSibling返回节点的下一个兄弟节点Text返回节点及其子节点文字内容Attribute返回节点是属性列表2.22.2 ADOADO 原理原理ADO(Active Data Object,活动数据对象)是一种基于 COM(组件对象模型)的自动化接口(IDispatch

20、)技术,并以 OLE DB(对象连接和嵌入的数据库)为基础,经过 OLE DB 精心包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。 ADO 提供了一组非常简单,将一般通用的数据访问细节进行封装的对象。由于 ODBC 数据源也提供了一般的 OLE DB Privider,所以 ADO 不仅可以应用自身的 OLE DB Privider,而且还可以应用所有的 ODBC 驱动程序。ADO 使得客户端应用程序能够通过任何 OLE DB 提供者来访问和操作数据库服务器中的数据,而不必进行 ODBC 配置。ADO 有两个主要优点:其一是易于使用、速度快、内存支出少和磁盘遗迹小。ADO 支持建

21、立 C/S(客户端/服务器)和基于 Web 的应用程序的关键功能;其二是“远程数据访问” (Remote Data Service,RDS), 能够通过一个来回的传输将数据从服务器移动到客户端应用程序或 Web 页中,然后在客户端对数据进行操作,最后将更新数据返回服务器。2.32.3 DelphiDelphi 介绍介绍Delphi 6 是 Borland 公司的可视化开发工具。从 Delphi 1 开始,Delphi系列开发工具就以其友好亲切的用户界面,丰富多样的开发工具,快捷而又准确的编译执行速度,强大的数据库开发能力以及灵活的发布应用方式深爱广大 Windows 程序员的喜爱。Delphi

22、 6 除了保留前面几种 Delphi 版本的优点外,更是带来了代码级跨平台、dbExpress 数据库访问等多种新特性。Delphi 对 XML 文档的管理有两种典型技术,使用文档对象模型(DOM)接口或者使用 XML 的 Simple API(SAX)。这两种方法完全不同:.DOM 可装载整个文档到一个层次结构的节点树中,允许读取他们并操作他们以改变文档,由于该原因,当我们希望在内存中确定 XML 结构的位置并编辑它、甚至重新创建文档时,使用 DOM 是很适合的。.SAX 用于分析文档,为文档的每个元素激活事件,而不用在内存上建立任何结构。一旦经过 SAX 分析,文档就会丢失,但通常该操作比

23、 DOM 树的结构要快,适合一次性读取文件,查找它的部分数据。另外还有一种处理 XML 文档的典型方法是:字符串操作。通过添加字符串来创建文档是最快的操作,但这个操作难于应付复杂的结构。此外 Delphi6 还提供了两种技术供我们考虑。一种用于定义一文档结构的接口,该接口只用于访问文档而不是通常的 DOM 接口。另一种技术用于开发转换过程,即允许读取一般的 XML 文档到 ClientDataSet 组件中,或保存到指定结构的 XML 文档中。在本系统中,我们主要使用了文档对象模型(DOM)接口,所以下面着重介绍一下 Delphi 对 DOM 的应用Delphi 将 DOM 的实现代码封装到一

24、个名为 XMLDocument 的组件中。使用组件代替实际 DOM 接口。使用 Delphi 的 XMLDocument,在较低层次上,我们能使用 DOMDocument 属性来访问标准的 W3C 文档对象模型接口。官方DOM 被定义在 xmldom 单元中,并包含像IDOMNode、IDOMNodeList、IDOMMAttr、IDOMElement 和 IDOMText 这样的接口。在较高层次上,XMLDocument 组件也可实现 XMLDocument 接口.并组成了诸如 IXMLNodeIXMLNodeList、 IXMLNodeCollection 等一些非常使用的接口。在 Del

25、phi 6.0 中,利用组件板【ADO】由七个组件组成。分为三组:连接型、ADO 访问型和兼容性型。我们把TADOTable 、TADOQurey 和TADOStoredProc划分为兼容性组件组。因为,它们为开发人员提供了大家所熟悉的分离的数据库表、查询和存储过程组件。使用这些组件不但能使基于BDE的程序向ADO转换更容易一些,而且开发人员可以自由地选择使用它们或前面讲的ADO访问组件。如同TADODataSet和TADOCommand,兼容性组件组也可以通过TADOConnection 或直接与一个数据存储连接。TADOTable被用于通过一个单个的数据库表来获取和操作数据集的元素。TAD

26、OQurey可以通过一个S Q L 语句或执行DDL(Data Definition Language) SQL 语句来获取和操作数据集的元素,比如CREATETABLE。TADOStoredProc 用于执行存储过程,无论它是否返回结果值。本系统采用 ADOquery,用 SQL 语句执行对数据库的操作。原因:1、运行稳定2、相对与 ADOTable,ADOquery 使用 SQL,数据操纵灵活。3、可重复利用,系统资源占用少4、便于升级 SQL 语句介绍:Access 数据库ADO 连接ADOquery1ADOquery2ADOquery3数据操作:select、delete、insert

27、、updata2.42.4 COMCOM 技术应用技术应用COM (组件对象模型 Component Object Model)是一个很庞大的体系。简单来说,COM 定义了一组 API 与一个二进制的标准,让来自不同平台、不同开发语言的独立对象之间进行通信。COM 对象只有方法和属性,并包含一个或多个接口。这些接口实现了 COM 对象的功能,通过调用注册的COM 对象的接口,能够在不同平台间传递数据。COM 的设计和开发不是本设计的重点,来自于平台。这里仅对如何调用 COM 做个说明。WebFax 客户端与 WEB 服务器通信通过两个接口发送和接受(转发归为发送) ,因为 COM 是对用户隐蔽

28、的,因此从用户的角度来说只是知道如何调用 COM,对于其工作的过程是不知道的,这样避免了 的伪造,提高了系统的安全性。使用 COM 时需要完成以下步骤:1、Web 平台的 COM 客户端程序拷贝到本设计的目录中,运行 DELPHI6.0 将 FAX 客户端和 COM 客户端添加到一个工程组中。2、然后运行 Register ActiveX Server 注册 DLL。3、在 FAX 客户端的源码的 USES 中添加 PEDIClientCOM_TLB,并使用如下代码:“var Send:IEDIClientCOM;”,再用“Send.COEDIClientCom.Create;”,就可以引用

29、Send 中的方法了。第三章第三章 系统原理系统原理3.13.1 单证确认系统设计框架图:单证确认系统设计框架图: 单证确认系统单证确认系统货代货代 单证确认系统单证确认系统货主货主 无有COM 组件接受端自动检测有无修改设该编号单证为已确认查看回复单证并与原单证内容比对接收、拒绝某部分新数据,设为问题单证WEB Server 服务器COM 组件该单证放入接收箱发送发送接收接收 货代发送新单证,业务流程开始点货代发送新单证,业务流程开始点 新单证生成XML 报文包等打包COM 组件WEB Server 服务器COM 组件报文包拆分单证查看、修改单证设为问题单证设置该编号单证为未确认设置该编号单

30、证为未确认单证查看、不作修改设置该编号单证为已确认接收接收发送发送3.3. 2 2 系统功能简介系统功能简介货代方与货主方都有各自的单证管理界面,通过这一界面很容易得到哪些是未确认的单证,哪些是已确认的单证,哪些是需要重复确认的单证。单证的生成实质是 XML 报文与 XSL 的结合。在本系统中对单证的任何操作实质是对 XML 报文的操作。 货代方发送过去的单证实质是 XML 报文,货主修改后回复过来的单证实质也是 XML 报文。自动比对功能通过定位 XML 报文每个节点,并把该节点的内容取出来,通过比较,把前后两个 XML 报文相同节点不同内容部分自动比较出来。货代方发送过来的单证,货主可以对

31、某些内容作修改。这一操作表面是对单证的修改,实质实现的是对 XML 报文的修改。对某些单证,货主存在直接确认,修改确认,再次修改确认等现象。对于这种情况,系统能够对这些多次确认进行识别,避免产生确认请求与回复确认的错位。货代向货主发出单证确认的请求。货主对这一单证进行确认回复给货代方,货代方在接收到这个单证时,通过自动检测功能自动判别出这一单证是货主直接回复未做修改的,还是货主做过修改的单证。通过这一检测功能能节省货主管理单证的时间。如果是直接确认未作修改的,系统自动把该编号的单证设为已确认,这样就不用进行下面的自动比对,接收或拒绝些数据的操作。3.33.3 功能模块设计原理与方法功能模块设计

32、原理与方法货代与货主都有其独立的单证管理系统界面,但两者的核心是类似的。在这个界面中我们有一个类似电子信箱的界面。因为考虑到 EDI 是一个系统,我们是分组合作的,界面具有一致性,本系统对单证作了两方面的分类管理。从确认类型上分: 已确认单证已经得到确认了的单证单证为确认单证还未得到确认过的单证问题单证经过修改过的还需发送新版本再次确认的单证从单证类型上分:BL(提单) 、(EN)托单(在实际中单证的种类是多种多样的,包括报关单、退税单、核销单、进仓单、装箱单、运费清单、发票等,不过在我们这个系统中只设定了上述两种单证。)货代方对于任何一张新建的单证,其实质都是对一张 XML 报文的操作。我们

33、的任务是让一张 XML 报文按照我们需要的标准格式显示出来。自动比对功能要实现的是两张同类报文编号,同种版本的货代方发送的单证与货主修改过的单证之间的差异比较,但其实质是两张 XML 报文节自定义 XML 报文自定义 XSL 样式单XSL处理器标准格式单证点内容的比较。由于经过 XSL 的装换,我们看到的各项内容,如“航次”等在 XML 报文里的节点名称是 oceanvessel,因此对 XML 报文修改时首先要作一个映射,使得当我们在 ListBox 中点击“航次”时,它自动映射到“ocenvessel”这个节点。在这个设计中我们使用了一个内置的 Memo,这个 Memo 上的每一行里的内容

34、在获得该单证类型后自动生成该单证的每一项项目名称。详细过程如下:该 TxjsFile 临时文件里的内容样式如下: 另外我们还制作了一个内置的 Memo,这个 Memo 里的内容则是在系统运行中自动从外部的一个 Text 中自动调用,其原理如图:XML 报文XSL 报文TxjsFile 临时文件20021029123509(工作编号)SENB100023-A (船名)MINGZHOU(航次)V36H(提单号)NBLAX303099-P(回执版本)20021029123511(处理结果)Y(备注)CALL ME AND I WILL TELL YOU.QQQ.(end) Memo Memo 里自动

35、生成如右上图类型的内容有了上面的内置 Memo 内容,我们就可以通过一个循环的节点内容读取语句,获得每个节点名称里的内容。如当我们读取 Memo 中“工作编号”时,系统自动读取 TxjsFile 这个临时文件里节点名为“工作编号”的内容,为“SENB100023-A”。这样我们的比对就可以开始了:获得 XML 报文类型调用对应类型的 TEXT 文档TEXT 文档内容加载到 Memo工作编号船名航次提单号回执版本处理结果备注工作编号船名航次发货时间回执版本处理结果备注 原报文 新报文 相同 不相同 不相同运用一个循环语句,我们很容易把 Memo 里的每一项与临时文件的每一项里内容作比较,获得那些

36、不相同的部分对于货代方新建的每一张报文,我们在存入数据库时设置了必须填写的几个字段。报文编号、报文版本号。如以一张 BL 的报文来说,假设它的 billofladingno 为 NBLAX303099-P(即为报文编号) ,version 为20021029123509(版本) 。对于进行多次确认的这张 BL 报文,它的billofladingno 是固定不变的,但是它的 version 却是 EDI 的时间戳,20021029123509(工作编号)SENB100023-A (船名)MINGZHOU(航次)V36H-A(发货时间)NBLAX303099-P(回执版本)200210291235

37、11(处理结果)Y(备注)CALL ME AND I WILL TELL YOU.QQQ.(end)20021029123509(工作编号)SENB100023-A (船名)HUAINOL(航次)V36H(发货时间)NBLAX303099-P(回执版本)20021029123511(处理结果)Y(备注)CALL ME AND I WILL TELL YOU.QQQ.(end)和 EDI 文件中的时间戳一致。这样不管货代发送多少次,因为它的固定不变的 billofladingno 我们很容易知道它是哪张报文,而它的 version 则帮助货代很容易就能辨别出这次回复过来的确认是我们需要的哪一次的

38、确认。通过报文编号与报文版本号的结合使用,我们就可以自动实现同步的问题。对于货代方发送过来的单证,货主需要进行回复。在这个系统中我们设置了两种类型的回复。第一种回复为直接回复,另外一种为修改回复。直接回复即对发送过来的 XML 报文里的数据不做任何修改;修改回复表示对报文的某些内容要提出异议,对这个 XML 报文作某些修改。在直接回复中,为了减轻服务器的工作量和便于货代方查看,我们只发送了 XML 报文的一小部分内容。这就相当于对一张 XML 报文作了某部分删除。如,以下面一张 XML 报文为例entrust0 1245555截断截断经过部分截断后的报文,大大减轻了服务器的流量。而且经过如此处

39、理后的 XML 报文在结构上仍然是完整的,这就为货代方的接收端自动检测功能创造了条件。因为对于这个被截断的 XML 报文来说,我们可以在接收端作一个检测处理, (在这个系统中我们设置为“”为我们的检测字符) 。当我们在报文中检测到这个“”时,那么我们就能判定这个回复过来的 XML 报文是未经过任何修改的,这样,我们就可以直接把该编号的报文自动设置为“已确认” ,减少了货代方再次查看处理该回复报文的时间。货主方单证的修改实质涉及的是 XML 报文内容的修改。而 XML 报文的修改是对其节点内容的修改。我们在设计这个模块时主要用到了 Delphi 的StringList 与 DOM 这两部分的知识

40、。通过这两部分知识的结合使用实现模块功能。我们首先作了一个 ListBox 和一个内置的 Memo,这个 ListBox里有我们需要修改的节点内容。当我们点击 ListBox 的某项时,Memo 自动加载该项名称的 XML 节点树路径。当获得这个路径以后,我们就很容易通过 DOM 获得该节点,对该节点进行各项操作。流程如下:索引 (Memo)(ListBox)当获得 detail/baseinfo/notifyparty/text 这个字符串时,我们就为这个字符串创建一个 StringList,通过 StringList 的分割程序把自动获取报文类型调用对应类型的路径文件调用对应类型的节点名称

41、文件- - - - - - - - - - - -detail/baseinfo/shipper/textdetail/baseinfo/consignee/textdetail/baseinfo/notifyparty/textdetail/baseinfo/ordermemodetail/booking/shipmentdate - - - - - - - - - - - - - - - - - - - - - - -提单货主收货人通知人通知人 订舱说明装期- - - - - - - - - - - -istox 选种该项detail/baseinfo/notifyparty/text 自

42、动分解成detail、baseinfo、notifyparty、text做完这个工作,我们就可以用 Delphi 自带的 XML 这个控件了。用 detail我们就可以遍历到这个 XML 节点树的 detail 节点,继续遍历直到遍历到“text”节点。在这个系统中我们以 aa 为这个节点的名称,这样我们就可以把我们在修改框中修改的内容附给这个节点的内容了,这样也就完成了对这个节点内容的修改:aa.Text:=edit1.Text;3.43.4 系统可扩展性系统可扩展性从上面的分析中我们知道,在这个系统中,我们只处理了 BL 与 EN 两种单证,而事实上在实际货操作中,单证的种类是多种多样的,

43、有报关单、退税单、核销单、进仓单、装箱单、运费清单、发票等。对于这些单证,虽然我们在本系统中不予支持,但是系统对他们的扩展性是给予支持的。我们的单证是用 XML 报文来写的,那么只要我们对每一种单证都按照我们规定的 XML 报文格式来写,想要扩展单证类型是很容易实现的。而且,我们的系统对于 XML 报文的结构限制是宽松的,我们只要求以后的每一张XML 报文,它的根节点与一级子节点强制使用我们规定的名称,而后面的子节点是可以任意定义的。有了 XML 报文,再附上对应类型单证的 XSL 报文,新类型的标准单证就可以生成了。至于比对,修改等这些操作,我们在调用外部文档时也都是通过调用类型选择性文档而

44、不是固定名称的文档来实现的。因此,只要你外围的附件全部完善了,想要扩展单证种类是很容易实现的。第四章第四章 核心代码分析及系统实现技术要点核心代码分析及系统实现技术要点4.14.1 XSLXSL 转换转换 XMLXML通过上面的一系列介绍,我们知道在本系统中多次用到了 XML 与XSLT,也可以这么说,本系统的核心就是对 XML 报文在 Delphi 中的探讨性运用。在这里我们用了两类 XML 报文和四张 XSL 报文。具体代码见附录。4.24.2 字符串搜寻字符串搜寻在报文拆分以及接收端自动检测功能这一块,多次用到了字符串搜寻功能。在一个文档中,指定某个字符串,则该程序能够返回该字符串在这个

45、文档中的位置。程序代码如下:function ScanFile(const FileName: string; /文件名称const forString: /要搜寻的字符串string;caseSensitive: Boolean): Longint; const BufferSize = $8001; / 32K+1 bytes var pBuf, pEnd, pScan, pPos: PChar; filesize: LongInt; bytesRemaining: LongInt; bytesToRead: Integer; F: file; SearchFor: PChar; oldM

46、ode: Word; begin Result := -1; /假定 failure if (Length(forString) = 0) or (Length(FileName) = 0) then Exit; SearchFor := nil; pBuf := nil; AssignFile(F, FileName); oldMode := FileMode; FileMode := 0; /只读模式 Reset(F, 1); FileMode := oldMode; Try SearchFor := StrAlloc(Length(forString) + 1); StrPCopy(Se

47、archFor, forString); if not caseSensitive then AnsiUpper(SearchFor); GetMem(pBuf, BufferSize); filesize := System.Filesize(F); bytesRemaining := filesize; pPos := nil; while bytesRemaining 0 do begin if bytesRemaining = BufferSize then bytesToRead := Pred(BufferSize) else bytesToRead := bytesRemaini

48、ng; BlockRead(F, pBuf, bytesToRead, bytesToRead); pEnd := pBufbytesToRead; pEnd := #0; pScan := pBuf; while pScan pEnd do begin if not caseSensitive then AnsiUpper(pScan); pPos := StrPos(pScan, SearchFor); if pPos nil then begin Found it! Result := FileSize - bytesRemaining + Longint(pPos) - Longint

49、(pBuf); Break; end; pScan := StrEnd(pScan); Inc(pScan); end; if pPos nil then Break; bytesRemaining := bytesRemaining - bytesToRead; if bytesRemaining 0 then begin Seek(F, FilePos(F) - Length(forString); bytesRemaining := bytesRemaining + Length(forString); end; end; While finally CloseFile(F); if S

50、earchFor nil then StrDispose(SearchFor); if pBuf nil then FreeMem(pBuf, BufferSize); end; end; ScanFile end.添加到附录添加到附录4.34.3 报文的合并与拆分报文的合并与拆分货代方新建的单证是经过 XSL 处理过的 XML 报文,当我们把这个新的单证发送出去接受货主方确认时,为防止 XML 报文再打开时发生与XSL 样式的不匹配等各种错误情况,我们需要把这个 XML 报文连同 XSL报文已经这个单证的 title 进行打包合并成一个文件以数据流的形式发送出去。在这个打包程序中我们主要使用

51、了文件流的用法。打包的程序如下:procedure Tnewform bine; /这个为合并程序 var s0:string ; InStream,OutStream : TFileStream; temp:string; begin getdir(0,s0); /首先得到运行路径 temp:=edit1.Text; /得到这个单证的 titile OutStream:=TFileStream.Create(s0+合成abc.xml,fmCreate); /放置合并后新文件的文件流 InStream:=TFileStream.Create(newfl.xml ,fmOpenRead); ou

52、tstream.Write(,7); outstream.Write(pchar(temp),length(temp); /把 title 放进新文件流里 outstream.Write(,8); OutStream.CopyFrom(InStream,InStream.Size); /把 XML 报文先放进去新文件流里 InStream.Free; InStream:=TFileStream.Create(newtype+.xsl ,fmOpenRead); OutStream.CopyFrom(InStream,InStream.Size); /把 XSL 报文放进新文件流里 InStre

53、am.Free; /文件流释放 Outstream.Free; end;货代方发送过来的报文是经过打包后的一个文件。里面内容包括title ,XML 报文和 XSL 报文。货主接收时首先要将这个打包文件进行拆分,分别得到 TITLE,XML 报文和 XSL 报文。文件的拆分的主要工作原理如下: 报文标题 报文包 检测头部 拆分 XML 报文 XSL 报文对于每一个打包发过来的报文包,都有它固定的格式,其主要格式如下: fb /报文标题 /从这里开始为 XM 报文 /XML 报文结束 /XSL 报文开始 . . /XSL 报文结束从上面的格式中可以看出对于我们要拆分的报文其头部都有特点。所以我们

54、只要能搜索到几个关键字符在报文中的 position 就可以把这个报文拆分出来。我们在程序中是通过搜寻如下几个字符串的:sta1:=ScanFile(FileName,false); sta1:=sta1+7; /用 ScanFile 这个字符串搜寻程序搜寻到这符串的位置,并指向下一个字符的位置end1:=ScanFile(FileName,false); /搜寻字符串 sta2:=ScanFile(FileNam,false); /搜寻 XML 报文起始格式字符串注意:注意:ScanFileScanFile 默认条件下返回的是它搜寻的第一个搜寻到的字符串位默认条件下返回的是它搜寻的第一个搜寻

55、到的字符串位置置 end2:=ScanFile(FileNam,false); end2:=end2+12; /搜寻 XML 结束标志,并指向下一个字符的位置通过上面对这些关键性字符串的搜索,以及他们返回的 position,我们就可以进行下面的拆分工作了。sstream:=Tstringstream.Create();Ori := TFileStream.Create(FileName, fmOpenRead); /打开这个合并的文件包放到流文件里 Tmp := TMemoryStream.Create; Ori.Seek(sta1,soFromBeginning); /搜寻要复制的开始点

56、Tmp.CopyFrom(ori,end1-sta1); /复制这个报文标题 Tmp.SaveToStream(sstream); /把复制好的报文标题存到Tstringstream 中 sstream.Free; Ori.Seek(sta2,soFromBeginning); /重新开始搜寻要复制的开始点 Tmp.CopyFrom(Ori, end2-sta2); /复制这个 XML 报文 Ori.Seek(end2,soFromBeginning); /再次搜寻要复制的开始点 Tmp.CopyFrom(ori, ori.size-end2); /复制这个 XSL 报文 注意:对于这里的各种

57、流,当进行新的复制时首先要对他们原来的内容进行清空,如上面的 Tmp,在进行新的复制时首先要对它Temp.free; 所有复制完毕后,也要对他们释放清空:FreeAndNil(Ori); FreeAndNil(Tmp);4.44.4 对对 XMLXML 报文的中间部分截断报文的中间部分截断直接回复即对发送过来的 XML 报文里的数据不作任何修改。对于这种类型的回复为了减轻服务器的工作量和便于货代方查看,我们只发送了XML 报文的 head 部分。这样就要求我们在回复时对这个 XML 报文进行大部分内容的删除,相当于对这个 XML 报文的某部分进行了删除。这个原理代码如下: Ori := TFi

58、leStream.Create(FileName, fmOpenRead); Tmp := TMemoryStream.Create; Tmp.CopyFrom(Ori, StartPos); /Tmp 从 Ori 拷贝数据,但在StartPos 与 EndPos之间不拷贝,因此形同删除了一段数据 Ori.Seek(EndPos,soFromBeginning); Tmp.CopyFrom(Ori, Ori.Size-EndPos); Tmp.SaveToFile(FileName); /在此设置输出文件名 4.54.5 单证的修改回复单证的修改回复n:=listbox1.ItemIndex;

59、 /返回 ListBox 中某需要修改项的索引s:=memo1.Linesn; /得到修改项在对应 memo 里的字符串设在 memo 里得到的字符串为以下形式:detail/baseinfo/notifyparty/text ss:=TstringList.Create; /StringList 的创建 ss.Delimiter:=/; / 分割符号为/ ss.DelimitedText:=s; /字符串内容为 Si:=ss.Count; /分割项数 XMLDocument1.LoadFromFile(bl.xml); / 装载 DOM aa:=xmldocument1.DocumentEl

60、ement; / 得到 DOM 的根节点for k:=0 to i-1 do /循环得到指定节点 aa:=aa.ChildNodesssk;aa.Text:=edit1.Text; /把修改后的内容给指定节点内容xmldocument1.SaveToFile(bl.xml); /保存这个 DOM 到文件4.64.6 节点内容比对节点内容比对TxjsFileTxjsFile 临时文件的生成临时文件的生成xslShow:=CreateOleObject(xmlpkg.xShow); SetFileText(temp.xjs,xslShow.xslTransmit (a+mainform.bwTyp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论