使用DTD验证XML文档
2010-02-04 17:29
513 查看
这本来应该不是一个困难的事情。但是,比较“无奈”的地方在于,必须在待验证的XML文档内部声明一个“DOCTYPE”引用DTD文件才可以验证。所以,更麻烦的问题在于需要为没有声明这个DOCTYPE的XML文档添加上这个声明。我还没有找到更好的办法。说明一下Context,需要执行此操作的是一个ASP.NET WebForm,XML文档来自于客户端上传的文件,而DTD文件位于服务器上。
下面说明一下具体的做法,虽然我最喜欢C#,但无奈于当前的Web项目必须使用VB.NET,因此这里的代码都是VB.NET。
首先,用XmlDocument对象加载客户端上传上来的XML文档流:
Dim doc As XmlDocument = New XmlDocument()
Try
doc.Load(fu.FileContent)
Catch ex As Exception
errMsg.Text = ex.Message
Return False
Exit Function
End Try
然后利用XmlDocument对象的InsertBefore对象插入需要的DOCTYPE:
doc.InsertBefore(doc.CreateDocumentType("importfile", Nothing, MapPath("dtdspec.dtd"), Nothing), doc.DocumentElement)
将添加了DOCTYPE之后的XML文档保存到内存流中,并要记得把内存流的Position归零:
Dim xmlStreamWithDTD As System.IO.MemoryStream
xmlStreamWithDTD = New System.IO.MemoryStream()
doc.Save(xmlStreamWithDTD)
xmlStreamWithDTD.Position = 0
最后利用XMLReader对象配合相应的设置,将内存流中的XML文档重新遍历一遍,进而得以验证XML文档是否符合DTD的定义:
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.ProhibitDtd = False
settings.ValidationType = ValidationType.DTD
Dim reader As XmlReader = XmlReader.Create(xmlStreamWithDTD, settings)
Try
While reader.Read()
End While
Catch ex As Exception
errMsg.Text = ex.Message
End Try
收工。
这么搞的问题在于内存要用两份,文档要遍历2遍,的确不是一个好办法,暂时只能这么样了,期待更好的做法。
下面说明一下具体的做法,虽然我最喜欢C#,但无奈于当前的Web项目必须使用VB.NET,因此这里的代码都是VB.NET。
首先,用XmlDocument对象加载客户端上传上来的XML文档流:
Dim doc As XmlDocument = New XmlDocument()
Try
doc.Load(fu.FileContent)
Catch ex As Exception
errMsg.Text = ex.Message
Return False
Exit Function
End Try
然后利用XmlDocument对象的InsertBefore对象插入需要的DOCTYPE:
doc.InsertBefore(doc.CreateDocumentType("importfile", Nothing, MapPath("dtdspec.dtd"), Nothing), doc.DocumentElement)
将添加了DOCTYPE之后的XML文档保存到内存流中,并要记得把内存流的Position归零:
Dim xmlStreamWithDTD As System.IO.MemoryStream
xmlStreamWithDTD = New System.IO.MemoryStream()
doc.Save(xmlStreamWithDTD)
xmlStreamWithDTD.Position = 0
最后利用XMLReader对象配合相应的设置,将内存流中的XML文档重新遍历一遍,进而得以验证XML文档是否符合DTD的定义:
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.ProhibitDtd = False
settings.ValidationType = ValidationType.DTD
Dim reader As XmlReader = XmlReader.Create(xmlStreamWithDTD, settings)
Try
While reader.Read()
End While
Catch ex As Exception
errMsg.Text = ex.Message
End Try
收工。
这么搞的问题在于内存要用两份,文档要遍历2遍,的确不是一个好办法,暂时只能这么样了,期待更好的做法。
相关文章推荐
- 为Eclipse添加XML文档所使用的DTD或XML Schema(xml编辑提示)
- 使用schema验证xml文档的合法性
- 如何为MyEclipse添加XML文档所使用的DTD
- 使用 XSLT 和 Java 扩展验证 XML 文档中的复杂约束
- .net下用dtd文档验证xml
- 使用DTD文档对 xml 1 作业中的xml文档进行约束,其中河北省只能依次包含石家庄市、张家口市、保定市这三个市,保定市可以有多个或者1个,给保定市定义属性编号为ID类型,必须有;属性name为字符
- 使用 Apache WSS4J 和 WebSphere DataPower SOA Appliances 对 XML 文档进行签名和验证
- 使用XmlDocument类加载XML文件时忽略DTD验证
- VB Script 如何使用XSD验证XML文档格式
- VB Script 如何使用XSD验证XML文档格式
- 使用XmlReader验证XML文档的规范性
- 使用JAVAAPI验证XML是否符合DTD的规定
- PHP DOM验证xml文档是否符合DTD验证
- DTD文档的结构---3.3.1: 验证XML文档的有效性
- xml基于DTD的XML文档有效性验证
- 如何为MyEclipse添加XML文档所使用的DTD
- 高级 XML 验证-使用 XSLT 和 Java 扩展验证 XML 文档中的复杂约束
- DTD验证XML文档
- XML第五讲:使用DTD验证XML有效性深入剖析
- 为Eclipse添加XML文档所使用的DTD或XML Schema