热门:网页模板.net视频教程JQueryMVCjsonExtJs源码示例三级联动JQuery菜单
您现在的位置:.Net中文社区>> XML编程>>正文内容

使用DTD验证XML文档

发布时间:2010年02月08日点击数: 佚名

这本来应该不是一个困难的事情。但是,比较“无奈”的地方在于,必须在待验证的XML文档内部声明一个“DOCTYPE”引用DTD文件才可以验证。所以,更麻烦的问题在于需要为没有声明这个DOCTYPE的XML文档添加上这个声明。我还没有找到更好的办法。说明一下Context,需要执行此操作的是一个ASP.NET WebForm,XML文档来自于客户端上传的文件,而DTD文件位于服务器上。
下面说明一下具体的做法,虽然我最喜欢C#,但无奈于当前的Web项目必须使用VB.NET,因此这里的代码都是VB.NET。
首先,用XmlDocument对象加载客户端上传上来的XML文档流:

  1. Dim doc As XmlDocument = New XmlDocument() 
  2. Try 
  3.     doc.Load(fu.FileContent) 
  4. Catch ex As Exception 
  5.     errMsg.Text = ex.Message 
  6.     Return False 
  7.     Exit Function 
  8. End Try 

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

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

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

  1. Dim xmlStreamWithDTD As System.IO.MemoryStream 
  2. xmlStreamWithDTD = New System.IO.MemoryStream() 
  3. doc.Save(xmlStreamWithDTD) 
  4. xmlStreamWithDTD.Position = 0 

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

  1. Dim settings As XmlReaderSettings = New XmlReaderSettings() 
  2. settings.ProhibitDtd = False 
  3. settings.ValidationType = ValidationType.DTD 
  4. Dim reader As XmlReaderXmlReader = XmlReader.Create(xmlStreamWithDTD, settings) 
  5. Try 
  6.     While reader.Read() 
  7.     End While 
  8. Catch ex As Exception 
  9.     errMsg.Text = ex.Message 
  10. End Try 

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

本站热点业务

更多模板/案例展示

热门推荐

关于我们 | 联系我们 | 团队日志 | 网站地图 | 网站合作