{"id":50,"date":"2008-09-29T14:59:22","date_gmt":"2008-09-29T18:59:22","guid":{"rendered":"http:\/\/hoolihan.net\/blog-tim\/?p=50"},"modified":"2008-09-29T14:59:22","modified_gmt":"2008-09-29T18:59:22","slug":"write-and-validate-xml-with-a-dtd-in-memory-in-net","status":"publish","type":"post","link":"http:\/\/hoolihan.net\/blog-tim\/2008\/09\/29\/write-and-validate-xml-with-a-dtd-in-memory-in-net\/","title":{"rendered":"Write and Validate XML with a DTD in Memory in .Net"},"content":{"rendered":"<p>This is the sample of piecing together a lto of different posts, so I thought I&#8217;d put a sample on the web&#8230;<\/p>\n<p>I&#8217;m putting it in VB.Net (because I was writing in it due to\u00a0project requirements<\/p>\n<p><code>Imports System.Xml<br \/>\nImports System.Xml.Schema<br \/>\nImports System.Text<br \/>\nImports System.IO<\/code><\/p>\n<p>Public Class MyXMLTool<br \/>\n\u00a0 Private sb As New StringBuilder(&#8220;&#8221;)<br \/>\n\u00a0 Private xw As XmlWriter<br \/>\n\u00a0 Private validXml As Boolean = True<br \/>\n\u00a0 Private validationErrors As String = &#8220;&#8221;<\/p>\n<p>\u00a0 Public Sub New()<br \/>\n\u00a0 End Sub<\/p>\n<p>\u00a0 Public ReadOnly Property ValidationMessages() As String Implements<br \/>\n\u00a0\u00a0 Get<br \/>\n\u00a0\u00a0\u00a0\u00a0 Return validationErrors<br \/>\n\u00a0\u00a0 End Get<br \/>\n\u00a0 End Property<\/p>\n<p>\u00a0 Public Function Prepare() As Boolean Implements iEnroller.Prepare<br \/>\n\u00a0\u00a0\u00a0 xw = XmlWriter.Create(sb)<br \/>\n\u00a0\u00a0\u00a0 xw.WriteStartDocument()<br \/>\n\u00a0\u00a0\u00a0 xw.WriteDocType(&#8220;MyRootElement&#8221;, Nothing, &#8220;MyDTD.dtd&#8221;, &#8220;&lt;!&#8211; This file represents my data &#8211;&gt;&#8221;)<br \/>\n\u00a0\u00a0\u00a0 xw.WriteStartElement(&#8220;MyRootElement&#8221;)<br \/>\n\u00a0\u00a0\u00a0 &#8216;Write everything else you want to write<br \/>\n\u00a0\u00a0\u00a0 xw.WriteEndElement()<\/p>\n<p>\u00a0\u00a0\u00a0 xw.WriteEndDocument()<br \/>\n\u00a0\u00a0\u00a0 xw.Close()<br \/>\n\u00a0\u00a0\u00a0 Return True<br \/>\n\u00a0 End Function<\/p>\n<p>\u00a0 Public Function Validate() As Boolean<br \/>\n\u00a0\u00a0\u00a0\u00a0 Dim xs As New XmlReaderSettings()<br \/>\n\u00a0\u00a0\u00a0 xs.ProhibitDtd = False<br \/>\n\u00a0\u00a0\u00a0 xs.ValidationType = ValidationType.DTD<br \/>\n\u00a0\u00a0\u00a0 AddHandler xs.ValidationEventHandler, New ValidationEventHandler(AddressOf ValidationCallback)<\/p>\n<p>\u00a0\u00a0\u00a0 Dim sr As New StringReader(sb.ToString())<br \/>\n\u00a0\u00a0\u00a0 Dim xr As XmlReader = XmlReader.Create(sr, xs)<\/p>\n<p>\u00a0\u00a0\u00a0 &#8216;this forces the validation process to occur by reading every line<br \/>\n\u00a0\u00a0\u00a0 While xr.Read<br \/>\n\u00a0\u00a0\u00a0 End While<\/p>\n<p>\u00a0\u00a0\u00a0 &#8216;this will be set False if the ValidationCallback happens<br \/>\n\u00a0\u00a0\u00a0 Return validXml<br \/>\n\u00a0 End Function<\/p>\n<p>\u00a0 Public Sub ValidationCallback(ByVal sender As Object, ByVal e As ValidationEventArgs)<br \/>\n\u00a0\u00a0\u00a0 validXml = False<br \/>\n\u00a0\u00a0\u00a0 validationErrors = e.Message<br \/>\n\u00a0 End Sub<\/p>\n<p>\u00a0 Public Sub GetXML() as String<br \/>\n\u00a0\u00a0\u00a0 return sb.ToString()<br \/>\n\u00a0 End Sub<br \/>\nEnd Class<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the sample of piecing together a lto of different posts, so I thought I&#8217;d put a sample on the web&#8230; I&#8217;m putting it in VB.Net (because I was writing in it due to\u00a0project requirements Imports System.Xml Imports System.Xml.Schema Imports System.Text Imports System.IO Public Class MyXMLTool \u00a0 Private sb As New StringBuilder(&#8220;&#8221;) \u00a0 Private [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,34,24],"tags":[41,44,45,40,42,43],"class_list":["post-50","post","type-post","status-publish","format-standard","hentry","category-aspnet","category-microsoft","category-web","tag-net","tag-in-memory","tag-stringbuilder","tag-xml","tag-xmlreader","tag-xmlwriter"],"_links":{"self":[{"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/posts\/50","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/comments?post=50"}],"version-history":[{"count":0,"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/posts\/50\/revisions"}],"wp:attachment":[{"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/media?parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/categories?post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/hoolihan.net\/blog-tim\/wp-json\/wp\/v2\/tags?post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}