基于XML Schema XML文档验证算法
吴家菊,纪 斌,刘振吉,陈泉根
(中国工程物理研究院 计算机应用研究所,四川 绵阳 621999)
摘 要: 文中研究XML文档的验证机制,提出一种基于XML Schema验证XML文档的算法。该算法将数据语法规则、约束要求及类型要求等采用XML Schema进行描述,既能够基于XML Schema验证XML文档语法的正确性,又提供语法错误的处理机制并支持错误位置追踪。当XML文档存在语法错误时,该算法将错误信息按照错误发生顺序依次输出。通过对错误信息的处理,该算法可以通过鼠标点击错误信息追踪语法错误发生位置。因而数据编辑人员可以高效地对XML文档做出修改,提高了工作效率。为验证该算法的正确性,将该算法集成到某XML编辑器中,并通过实验验证。经过一系列的试验验证,该算法达到了设计要求。
关键词: XML Schema;XML;文档验证算法;语法错误;错误信息处理;错误位置追踪
0 引 言
XML(Extensible Markup Language)作为一种通用的数据描述和交换语言,在Internet上和企业内部得到了广泛应用,当前在武器装备综合保障领域XML被广泛用于描述综合保障数据[1]。对于已编辑的XML数据,在其应用到综合保障系统或其他应用领域之前,需要对其进行语法验证。XML Schema是W3C Recommendation推荐的标准,可用于设计、约束和验证XML文档。XML Schema文档中明确定义了XML文档中元素的应用规则,比如元素的名称、具有的属性、出现次序、出现次数、数据类型、父元素、子元素等[2-3]。因此基于XML Schema设计的XML文档可以使用XML Schema来验证文档的语法正确性。
图8为样机定子3D结构模态振型图。图8中,n代表径向模态阶数,m代表定子沿轴的两种振动形式。当m=0时,壳体同向振动;当m=1时,壳体反向振动[8]。其中径向模态是引起电机振动噪声的主要原因[9]。
自21世纪初XML Schema成为W3C Recommendation推荐标准以来,XML Schema由于其诸多优势正逐步替代DTD(Document Type Definition)成为XML设计、约束和验证的主流方式[4]。国内外有诸多基于XML Schema验证XML文档的研究。余双等学者在中科院软件所开发的OnceStAXParser的基础上设计实现了基于XML Schema的高效XML验证器[5-6]。王伟良等学者首先基于XML Schema构造了其抽象模型(Abstract XML Schema Model,AXSM),然后提出了一种基于XML Schema验证XML文档的方法[7]。许桂艳等学者基于SAX(Simple API for XML)解析实现了一种基于XML Schema验证XML文档的方法[8-9]。其他学者在研究过程中提出了其他的验证方法。这些方法都实现了基于XML Schema验证XML文档,并且能够有效地输出错误信息。随着深入的研究发现,这些方法或基于特定的平台或解析器,或作为独立的系统存在,在跨平台可移植性、轻量化设计、易集成性等方面存有缺陷,并且在实际应用中不支持错误位置追踪。
为解决当前基于XML Schema验证XML文档研究中存在的缺陷和实现依据错误信息追踪错误位置,本文提出一种跨平台可移植性性好、轻量化设计、易于与其他系统集成的基于XML Schema验证XML文档的算法。该方法基于 DOM(Document Object Model)[10]解析,支持依据错误信息追踪错误位置。通过配合使用错误信息,方便XML数据编辑人员找寻文档中语法错误位置,提高了XML数据编辑人员的工作效率。当前该方法已集成到某XML编辑器中,在实践中验证了其可行性。
中国共产党的早期知识分子在接受马克思主义的时候不是照搬马克思主义的全部理论,而是有选择性的接受一些和中国现实密切相关的理论进行宣传。正如一些学者所讲:“中国的先进分子一开始就不是把马克思主义当作单纯的学理来探讨,而是把它看作观察国家命运的工具加以接受的。尽管理论准备并不充分,他们一旦学到马克思主义基本原理,就以此为指导,积极投身到群众斗争中去。”[6]正是由于五四时期的马克思主义社团的积极宣传,开始使越来越多的人注意到马克思主义,并开始初步地把马克思主义基本原理同中国的革命与实践结合起来。
1 算法设计
为了实现该算法跨平台可移植性、轻量化设计、易集成性,首先对该算法进行设计。算法设计如图1所示。算法后续描述使用Java编程语言,对于其他编程语言,则只需用该编程语言实现算法的设计。
图1 基于XML Schema验证XML算法设计图
Fig.1 Design diagram of XML validation algorithm based on XML Schema
为了完整地描述该算法的设计思想,算法描述从已编辑并保存的XML文档开始。若将该算法移植或集成到XML编辑器中时,可以省略前两步,直接依据保存已编辑XML数据的Document类型文档获取其克隆文档,然后执行后续的步骤。
2 算法实现
2)判断该错误类型属于DOMError.SERIT-Y_WARNING,DOMError.SERI-TY_ERROR,DOMError.SERITY_FATAL_ERROR中的哪一类。
2.1 定义错误类
首先,用Java语言实现DOM编程接口以获取解析器实例;其次,获取XML文档的URL路径,并将该URL路径作为DOM解析器实例的传入参数;第三,DOM解析器依据传入参数解析XML文档,获取解析文档(命名为doc);第四,解析文档doc调用cloneNode()方法获取doc的克隆文档(命名为clone)。
南宁市有关政府部门应不断重视加强旅行社等行业的管理,使旅游业得以健康发展。随着十五届博览会的顺利举办,展会服务人员的外语水平、服务技能得到了重视并有了较大改善。但整个南宁市的总体服务水平还有待提升。建议旅游相关部门进行长期规划,酒店、饭店、旅行社、商场、娱乐场所、出租车及其他窗口行业等从业人员进行外语、服务技能培训,提升南宁旅游服务的总体水平。
语言是一个国家特有的文化和历史象征,也是各个民族的一个重要特征。世界各国在发展过程中,随着时代和社会的不断进步与发展,每个国家的文化以及语言都会发生相应的改变。韩语作为韩国文化的一部分,也会随着韩国文化时代发展的变迁而发生改变。
1)在Error中定义两个变量:一个为Node类型的变量(命名为node);一个为int类型的变量(命名为p1)。
2)在Error中定义构造函数,构造函数有两个传入参数:一个为Node类型,对应于XML文档的解析文档中存在语法错误的节点;另一个为int类型,对应于上述定义的content变量表示的字符串长度。
3)在构造函数中定义变量赋值语句:将Node类型的传入参数赋值给Error类中定义的node变量;将int类型的传入参数赋值给Error类中定义的p1变量。
此外在该算法中定义一个ArrayList<Error>类型的变量errors。该变量中保存按照验证过程实例化的错误对象,错误对象加入链表的顺序按照验证过程中语法错误顺序。
2.2 DOM解析XML文档
DOM可以以一种独立于平台和语言的方式访问和修改一个文档的内容和结构,DOM实际上是以面向对象方式描述的文档模型[11]。使用DOM定义的接口来获得对文档中所有元素进行访问的入口,创建文档,浏览文档结构,添加、修改或删除文档元素和内容[12]。DOM解析XML文档后所生成的文档树会保存在内存中,DOM的这一特性是本算法实现追踪错误发生位置的基础。
为保证验证过程不对源XML文档造成影响,获取了XML解析文档的克隆文档,该验证算法的所有后续操作均在克隆文档中进行。
在本文算法中,DOM解析XML文档以获取解析文档,继而获取解析文档的克隆文档的流程图如图2所示。
为实现本文后面描述算法的错误位置追踪功能,在该算法中将验证过程中出现的每一个语法错误都实例化为一个错误对象,为此在该算法中定义一个错误类(命名为Error)。Error类的定义过程包括:
图2 基于DOM解析XML文档流程图
Fig.2 Flow chart of XML document parsing based on DOM
2.3 对clone执行相关操作
获取clone的DOMConfiguration对象,并为该对象设置相关参数的步骤如下:
1)clone通过调用 getDomConfig()方法获取其DOMConfiguration对象(命名为config);
2)config对象调用 setParameter(String name,Object value)方法,name值为“schema-type”,value值为“http://www.w3.org/2001/XMLSchema”;
鼠标点击事件函数定义过程包括:
4)config对象调用 setParameter(String name,Object value)方法,name值为“validate”,value值为true;
5)config对象调用 setParameter(String name,Object value)方法,name值为“error-handler”,value值为错误处理类的实例化对象。
2.4 定义错误处理类
为处理验证过程中出现的语法错误,获取错误信息以及保存错误信息,在该算法中定义了一个错误处理类(命名为handleError),并在该类中定义错误处理函数。handleError实现DOMErrorHandler接口,错误处理函数的定义过程如下:
1)错误处理函数有一个DOMError类型的传入参数(err)。
2)定义一个DOMLocator类型的变量(loc),并将err调用getLocation()方法获取的值赋值给loc;
3)将验证过程中的语法错误实例化为Error对象,并保存在errors变量中,以备进行错误信息追踪;
钾肥膨果却也阻钙。钾作为作物生长必需的大量元素之一,可促进植物光合作用,提高二氧化碳同化率,既有利于植物叶绿素合成,也有助于改善叶绿体结构,同时还有助于膨果。而目前很多种植者存在一个误区,认为钾肥膨果就大量施用钾肥,导致膨果期需要大量钙元素时期土壤中钙含量严重不足,从而出现脐腐病、顶枯病等病害。
4)判断语法错误类型;
5)更新错误信息,以备将错误信息输出。
其中语法错误实例化Error对象的过程包括:
依据clone文档的语法错误节点在文档doc中找到对应节点node;调用Error类的构造函数并将node和content.length()作为传入参数,获取Error对象。XML文档第一次出现语法错误时,在content未更新,因此content.length()=0。
思雨似醉非醉,来到大河宾馆。大河宾馆他熟悉,他的客户都是安排在这里住宿的。他走进大厅,值班经理小林姑娘忙上前来问候,一看杜经理有酒醉之意,忙过来搀扶。小林经理同杜经理都很熟悉,杜经理每次来,小林经理都格外热情关照。小林经理今晚发现杜经理像醉了,又见只有他一个人,就直接把杜经理搀扶到房间里去了。
依据clone文档的语法错误节点在doc中找到对应节点node的流程图如图3所示。其本质是从当前发生语法错误节点开始向根节点追溯,在追溯过程中依次保存在错误节点之前的兄弟节点个数、在错误节点的父节点之前的兄弟节点个数、在错误节点的父节点的父节点之前的兄弟节点个数…,依次类推,直到到达XML文档的根节点,最后得到一个ArrayList<Integer>类型的变量。然后根据变量中保存的int类型的数据,在doc中从根节点开始向下追溯,直至在doc中找到与clone中错误节点对应的节点。
其中判断语法错误类型的过程包括:
1)err通过调用getSerivity()方法获取当前语法错误类型。
目前,许多地区的经济水平比较落后,在构建环境监测站时投入的资金较少,经济落后致使资金投入力度不够,使得采购的监测仪器设备不够先进,仪器设备比较老旧,这些问题在很大程度上限制了环境监测的顺利实施。
为保存验证过程中语法错误信息,在该算法中定义一个String类型的变量(为方便描述,命名为content。后续对变量命名原因相同)。在发生语法错误时由错误处理函数获取错误信息,并将错误信息更新到content中。最后将content中保存的XML文档所有语法错误信息输出。
式中:m为汽车总质量;vy和vx分别为沿y方向和x方向的速度;Fcr和Fcf为施加到后轮和前轮的侧向力;δf为前轮转向角;Iz为质量惯性矩;ψ为偏航角;lf和lr分别为前后轮和质心之间的距离;l为后轴和前轴之间的距离;αf和αr分别为前后轮的侧滑角.
万姐的家,比我想象的还要简陋,土坯的房子,坍塌了一半。我见到了她的女儿小洁,自从万姐去世后,她就一个人固执地生活在这幢破败的房子里。
判断错误类型的流程图如图4所示。该步骤的主要目的是判断错误类型并将描述错误类型的信息更新到content中,以在输出的错误信息中标明该错误属于何种类型。延续上一步在content中更新的表示错误类型的内容,err通过调用getMessage()方法获取详细错误信息,并将错误信息更新到content中,然后在content中已有内容后添加一个换行符,以便将描述不同错误信息分行输出。
通过以上的例子可以看出,由于不同语言造成的思维方式、文化习惯等差距的客观存在,使得若干原语中的某些文化或语言因素无法被译语国家读者容易理解。这使得这些寓言标题翻译面临困难。然而,译者抛开了固化的思维,根据具体实际采取某些恰当的翻译方法如省译法,增译法或者另立标题法对原语信息进行重新剪裁等处理,消融了不同语言和文化间的障碍,让原语读者和译语读者获得相一致的阅读效果,产生了相近甚至相同的阅读反应,实现了翻译效果的动态对等。
错误位置追踪函数本质是一个JEditorPane的鼠标点击事件函数,当鼠标点击在JEditorPane上输出的错误信息时,实现依据错误信息追踪语法错误位置。
2.5 定义错误追踪函数
将错误信息输出的方式有多种,既可以以文本形式输出,也可以定义一个信息输出面板用于输出错误信息。为了达到该算法能够依据错误信息追踪错误位置的目的,在该算法中采用信息输出面板的方式输出错误信息。具体来说是应用GUI编程,首先,定义一个JFrame;然后,在JFrame中嵌入一个JEditorPane;第三,判断content的内容是否为空,若为空,则将content变量的内容设为“XML文档语法正确”;最后,JEditorPane调用setText()方法,将保存错误信息的content作为JEditorPane的内容,这样就可以将保存错误信息的content变量的内容输出。
此外为直观显示错误信息追踪效果,XML文档的解析文档doc同样要以信息输出面板的方式输出。同错误信息输出一样,采用GUI编程,将解析文档doc中的每个元素的名称、属性、内容、子元素、父元素等信息按照XML文档中元素的顺序输出。
图3 查找doc中存在语法错误节点流程图
Fig.3 Flow chart of searching syntax error nodes existing in doc
图4 判断错误类型流程图
Fig.4 Flow chart of judging error type
1.池塘条件。该项目所利用池塘地势平坦、水源充足、水质良好、周边没有污染源,并具备水、电、路三通的基本条件。池塘面积多数都在5~10亩,可蓄水1.3~2m,池埂较宽,池堤坡度1∶3。
3)config对象调用 setParameter(String name,Object value)方法,name值为“schema-location”,value值为XML Schema文档的URL路径;
1)函数有一个MouseEvent类型的传入参数(命名为e);
2)在鼠标点击事件函数中定义三个int类型的变量和一个Node类型的变量;
3)将描述错误类型的相关信息更新到保存错误信息的content变量中。
乐府诗集里有一首诗是这样说的:“青青园中葵,朝露待日晞。阳春布德泽,万物生光辉。常恐秋节至,焜黄华叶衰。百川东到海,何时复西归?少壮不努力,老大徒伤悲。”我觉得它对于所有年龄阶段的人都有其深刻的教育意义。尤其我们这一职业,要给学生一碗水,首先自己要有一桶水。“活到老,学到老”,在知识更新换代发展迅猛的今天,只有不断学习,才能不断进步,不断提高。
3)依据相关变量确定鼠标点击的错误信息并将errors变量中对应于错误信息的error对象给相关变量赋值;
4)在JEditorPane上依据相关变量选中鼠标位于点击位置的错误信息;
5)依据相关变量值在doc中找到存在语法错误的节点。
其中:定义的三个int类型变量分别命名为position,p1,p2;Node类型的变量命名为node;position对应于鼠标在JEditorPane的点击位置,取值由JEditorPane调用viewToModel(e.getPoint())方法获取;p1和p2的初始值为0;node的初始值为null。
其中依据相关变量确定鼠标点击的错误信息并将errors变量中对应于错误信息的error对象给相关变量赋值的伪代码如下:
在JEditorPane上依据相关变量选中该条错误信息的步骤为:
1)判断p2==0是否为真,若为真,则将content变量表示的字符串的长度值赋值给p2(当鼠标点击JEditor-Pane显示的最后一条错误信息时,p2==0)。
2)JEditorPane调用 setCartPosition(p1)和moveCart-Position(p2)方法选中JEditorPane上位于鼠标点击位置处的错误信息。
上述获取的node为鼠标点击选中的语法错误信息对应的节点,在doc中找到该节点并以高亮的方式显示该节点。
由于到货验收单、投运单、质保单等物资合同结算单据中的数据均可以通过ERP主数据库进行提取,可以通过系统中结构化的数据自动生成付款单据,并结合移动应用、电子签章、生物识别等技术,实现合同管理过程的单据结构化。
3 实验验证
为验证该算法的正确性、有效性以及是否能够依据错误信息追踪错误位置,将该算法集成到某XML编辑器中。该XML编辑器已编辑的XML数据以Document类型的文档保存。在集成过程中,首先获取该Document类型文档的克隆文档,然后直接执行后续的验证操作。在验证过程中验证结果如图5所示。
从图5可以看出:首先,对于验证过程中的语法错误该算法能够按照错误发生顺序将错误信息输出,并且每条错误信息既包含错误类型又包含导致错误的详细信息;其次,该算法中设计的错误位置追踪功能能够有效地依据鼠标点击位置首先选择位于鼠标点击位置的错误信息,进而在XML文档的DOM解析文档的信息输出面板中找到该错误信息对应的错误节点并高亮显示。为验证该算法验证结果的正确性,选取若干已知存在语法错误的XML文档,将这些XML文档分别在集成了该算法的XML编辑器和诸如XMLSpy等商用成熟软件中进行验证,然后对比验证结果。分析验证结果发现,该算法能够完整、有效地验证XML文档,达到设计要求。
图5 验证结果图
Fig.5 Picture of verification results
4 结 语
为了实现基于XML Schema验证XML文档算法的可移植性性、轻量化设计、易集成以及支持错误追踪,本文提出一种基于XML Schema验证XML文档的算法。该算法基于DOM解析XML文档,为保证验证过程不影响源XML文档,验证操作在XML文档的DOM解析文档的克隆文档上进行。为验证该算法能否准确、有效地验证XML文档以及能否实现错误位置追踪,将该算法集成到某XML编辑器中,经过一系列的试验验证,该算法达到了设计要求。下一步将在该算法的基础上实现语法错误信息汉化输出。
参考文献
[1]徐宗昌.装备IETM技术标准实施指南[M].北京:国防工业出版社,2012.
XU Zongchang.Implementary guide of equipment IETM technical standard[M].Beijing:National Defense Industry Press,2012.
[2]W3C.W3C XML Schema definition language(XSD)1.1 Part 1:Structures[EB/OL].[2012-04-05].https://www.w3.org/TR/xmlschema11-1/.
[3]W3C.W3C XML Schema definition language(XSD)1.1 Part 2:Datatypes[EB/OL].[2012-04-05].https://www.w3.org/TR/xmlschema11-2/.
[4]曹风华.一种XML解析器技术的研究与实现[J].微型机与应用,2011,30(21):6-10.
CAO Fenghua.Research and implementation of an XML parser technology[J].Microcomputer&its applications,2011,30(21):6-10.
[5]余双,曹冬磊,戴蓓洁,等.高效XML验证技术的实现[J].计算机工程与设计,2008,29(4):937-941.
YU Shuang,CAO Donglei,DAI Beijie,et al.Research on high performance implementation of XML validation[J].Computer engineering and design,2008,29(4):937-941.
[6]REN X,CAO D,JIN B.An efficient STAX based XML parser[C]//Proceedings of the 11th Joint International Computer Conference.[S.l.:s.n.],2005:203-207.
[7]王伟良,施佺,曹渠江.基于XML Schema抽象模型的XML模式验证方法[J].计算机应用与软件,2007,24(3):41-43.
WANG Weiliang,SHI Quan,CAO Qujiang.A method for XML document schema validation with abstract XML schema model[J].Computer applications and software,2007,24(3):41-43.
[8]许桂艳,张建,李淼,等.基于XML Schema的知识描述与模式验证[J].计算机系统应用,2008,17(9):33-37.
XU Guiyan,ZHANG Jian,LI Miao,et al.Knowledge representation and pattern validation based on XML Schema[J].Computer systems&applications,2008,17(9):33-37.
[9]PAN Y,ZHANG Y,CHIU K.Hybrid parallelism for XML SAX parsing[C]//Proceedings of IEEE International Conference on Web Service.Beijing:IEEE,2008:505-512.
[10]MA J,ZHANG S,HU T,et al.Parallel speculative Dombased XML parser[C]//Proceedings of 14th International Conference on High Performance Computing and Communication&9th International Conference on Embedded Software and Systems.Liverpool:IEEE,2012:33-40.
[11]Jeremy Keith,Jeffrey Sambells.JavaScript DOM编程艺术[M].北京:人民邮电出版社,2011.
KEITH J,SAMBELLS J.DOM scripting:Web design with JavaScript and the document object model[M].Beijing:Posts&Telecom Press,2011.
[12]W3C.XML DOM[EB/OL].[2018-02-26].http://www.w3school.com.cn/xmldom/dom_intro.asp.
An XML document validation algorithm based on XML Schema
WU Jiaju,JI Bin,LIU Zhenji,CHEN Quangen
(Institute of Computer Application,China Academy of Engineering Physics,Mianyang 621999,China)
Abstract: The validation mechanism of the XML document is researched,and an XML document validation algorithm based on XML Schema is proposed in this paper.In the algorithm,the data syntax rules,restraint requirement and type requirement are described by using XML Schema,which can not only verify the syntax correctness of the XML document on the basis of XML Schema,but also provide the processing mechanism of syntax error and support error position tracking.The algorithm can output error information in order according to the error occurring sequence if syntax errors exist in the XML document.The algorithm tracks syntax error position by means of mouse clicking after error information processing,so that the data editing personnel can modify the XML document efficiently and improve their own work efficiency.The algorithm was integrated into an XML editor and a series of experiments were carried out,so as to verify the correctness of the algorithm.The results show that the algorithm can achieve the design requirement.
Keywords: XML Schema;XML;document validation algorithm;syntax error;error information processing;error position tracking
中图分类号: TN911-34;TP311
文献标识码: A
文章编号: 1004-373X(2019)04-0071-05
DOI: 10.16652/j.issn.1004-373x.2019.04.017
收稿日期: 2018-05-22
修回日期: 2018-07-11
基金项目: 装备预研领域基金(614000402)
Project Supported by Equipment Pre-Research Field Fund(614000402)
作者简介:
吴家菊(1978—),女,高级工程师,硕士生导师,CCF会员,IEEE会员,主要研究方向为装备综合保障信息化、软件工程、数据库等。
纪 斌(1990—),男,在读硕士研究生,主要研究方向为软件工程与数据库。
标签:XML论文; schema论文; 文档验证算法论文; 语法错误论文; 错误信息处理论文; 错误位置追踪论文; 中国工程物理研究院计算机应用研究所论文;