使用DTD验证XML文档

摘要:
但是,比较“无奈”的地方在于,必须在待验证的XML文档内部声明一个“DOCTYPE”引用DTD文件才可以验证。所以,更麻烦的问题在于需要为没有声明这个DOCTYPE的XML文档添加上这个声明。说明一下Context,需要执行此操作的是一个ASP.NETWebForm,XML文档来自于客户端上传的文件,而DTD文件位于服务器上。这么搞的问题在于内存要用两份,文档要遍历2遍,的确不是一个好办法,暂时只能这么样了,期待更好的做法。

这本来应该不是一个困难的事情。但是,比较“无奈”的地方在于,必须在待验证的XML文档内部声明一个“DOCTYPE”引用DTD文件才可以验证。所以,更麻烦的问题在于需要为没有声明这个DOCTYPE的XML文档添加上这个声明。我还没有找到更好的办法。说明一下Context,需要执行此操作的是一个ASP.NET WebForm,XML文档来自于客户端上传的文件,而DTD文件位于服务器上。

下面说明一下具体的做法,虽然我最喜欢C#,但无奈于当前的Web项目必须使用VB.NET,因此这里的代码都是VB.NET。

首先,用XmlDocument对象加载客户端上传上来的XML文档流:

DimdocAsXmlDocument=NewXmlDocument()
Try
doc.Load(fu.FileContent)
CatchexAsException
errMsg.Text
=ex.Message
ReturnFalseExitFunctionEndTry

然后利用XmlDocument对象的InsertBefore对象插入需要的DOCTYPE:

doc.InsertBefore(doc.CreateDocumentType("importfile",Nothing,MapPath("dtdspec.dtd"),Nothing),doc.DocumentElement)

将添加了DOCTYPE之后的XML文档保存到内存流中,并要记得把内存流的Position归零:

DimxmlStreamWithDTDAsSystem.IO.MemoryStream
xmlStreamWithDTD
=NewSystem.IO.MemoryStream()
doc.Save(xmlStreamWithDTD)
xmlStreamWithDTD.Position
=0

最后利用XMLReader对象配合相应的设置,将内存流中的XML文档重新遍历一遍,进而得以验证XML文档是否符合DTD的定义:

DimsettingsAsXmlReaderSettings=NewXmlReaderSettings()
settings.ProhibitDtd
=False
settings.ValidationType
=ValidationType.DTD
DimreaderAsXmlReader=XmlReader.Create(xmlStreamWithDTD,settings)
TryWhilereader.Read()
EndWhileCatchexAsException
errMsg.Text
=ex.Message
EndTry

收工。

这么搞的问题在于内存要用两份,文档要遍历2遍,的确不是一个好办法,暂时只能这么样了,期待更好的做法。

免责声明:文章转载自《使用DTD验证XML文档》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python 编程中的一个关于图片的库 imageio (读取照片RGB内容,转换照片格式)Vagrant在win7/win10系统下搭建使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

图片标注工具LabelImg使用教程

1.进入labelImg-master文件夹,在空白处使用 “Shift+鼠标右键” ,选择在此处打开命令窗口,依次输入下面语句即可打开软件。 pyrcc4 -o resources.py resources.qrc python labelImg.py 2.使用方法 - 修改XML文件保存位置,使用快捷键 “Ctrl+R” ,改为自定义位置,这里的路...

Android定制组件之TitleBar之涂鸦

传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229         今天我们学习如何实现一个自定义的窗口标题,下面给出该场景的案例: 1案例技术要点(待整理) 2案例代码陈列 AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?...

spring security xml配置详解

security 3.x <?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/security"xmlns:beans="http://www.springframework.org/schem...

使用postman调用webservice接口

PostMan调用webservice接口,采用post方式,参数使用xml格式。 #实例 1、webservice地址:http://192.168.2.13/psum/UserModuleService.asmx;2、上传方式选择POST方式;3、header中设置:Content-Type:text/xml;charset=utf-84、参数:(xm...

Winform中对自定义xml配置文件进行Xml节点的添加与删除

场景 Winform中自定义xml配置文件后对节点进行读取与写入: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100532137 在上面已经对xml配置文件对节点能进行读取与写入之后 ,实现对节点元素的 添加与删除。 关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。大量...

对XML里的属性或元素进行模糊搜索的方法

最近发现几个贴子都是问关于对XML的属性或元素进行模糊搜索的方法,在此发出代码片段示例,希望能够对你有所帮助;) 示例XML private var xml:XML=<employees>        <employee>            <name>Christina Coenraets</name>...