<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sietoebie &#187; selectsinglenode</title>
	<atom:link href="http://www.sietoebie.be/tag/selectsinglenode/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sietoebie.be</link>
	<description>Software solutions and questions blog</description>
	<lastBuildDate>Mon, 22 Mar 2010 11:39:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>XSD en XML</title>
		<link>http://www.sietoebie.be/2008/12/04/xsd-en-xml/</link>
		<comments>http://www.sietoebie.be/2008/12/04/xsd-en-xml/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 13:46:04 +0000</pubDate>
		<dc:creator>Christophe</dc:creator>
				<category><![CDATA[Visual Basic]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[selectnodes]]></category>
		<category><![CDATA[selectsinglenode]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.sietoebie.be/?p=108</guid>
		<description><![CDATA[Ik zit al een tijdje te zwoegen op het inlezen van een XML bestand dat moet voldoen aan de normen van een XSD bestand.
Ik doe dit in VB6.0
Als ik mijn variabelen als volgt declareer :

' maak een referentie naar microsoft xml4.0 (project - references)
' declareer variabelen
Dim sSchemaFile As String
Dim sWorkFile As String
sSchemaFile = txtSchemaPath.Text
sWorkFile = [...]]]></description>
			<content:encoded><![CDATA[<p>Ik zit al een tijdje te zwoegen op het inlezen van een XML bestand dat moet voldoen aan de normen van een XSD bestand.<br />
Ik doe dit in VB6.0</p>
<p>Als ik mijn variabelen als volgt declareer :</p>
<p><code><br />
' maak een referentie naar microsoft xml4.0 (project - references)<br />
' declareer variabelen<br />
Dim sSchemaFile As String<br />
Dim sWorkFile As String<br />
sSchemaFile = txtSchemaPath.Text<br />
sWorkFile = txtPath.Text<br />
Dim schemaCache As MSXML2.XMLSchemaCache40<br />
Set schemaCache = New MSXML2.XMLSchemaCache40<br />
' toevoegen van de namespace aan de schemacache<br />
schemaCache.Add "http://mijnnamespace.be/xml", sSchemaFile<br />
Dim xml_document As MSXML2.DOMDocument40<br />
Set xml_document = New MSXML2.DOMDocument40<br />
Set xml_document.Schemas = schemaCache<br />
</code></p>
<p>Dan wordt de XML file getoetst door<br />
<code>Set xml_document.Schemas = schemaCache</code></p>
<p>Inlezen van het bestand in onze variabele:<br />
<code>xml_document.async = False<br />
If Not xml_document.Load(sWorkFile) Then<br />
    MsgBox "Error - : " &#038; xml_document.parseError.reason<br />
    Exit Sub<br />
End If</code></p>
<p>Maar als ik nu een enkele node of een reeks nodes in een nodeobject wens in te lezen dan krijg ik steeds een &#8216;Nothing&#8217; als return waarde.</p>
<p><code><br />
' declareer node objecten<br />
Dim values_node As IXMLDOMNode  ' single node<br />
Dim values_nodelist As IXMLDOMNodeList  ' nodelijst (array)</p>
<p>Set values_node = xml_document.SelectSingleNode("form//contactperson/name")  --> Nothing<br />
Set values_node = xml_document.SelectSingleNode("form//contactperson/name")  --> Nothing<br />
</code></p>
<p>Ik heb de namespace dan toegevoegd aan de eigenschappen van het xml object (xml_document in mijn geval)</p>
<p><code>xml_document.validateOnParse = True  'nodig vooraleer we de namespace property instellen<br />
xml_document.setProperty "SelectionNamespaces", "xmlns:x='http://mijnnamespace.be/xml'"</code></p>
<p>We gebruiken x als prefix.</p>
<p>Uitlezen:<br />
<code>Set values_node = xml_document.SelectSingleNode("x:form//contactperson/nom")  --> Nothing<br />
' Attributen uitlezen:<br />
Set values_nodelist = xml_document.SelectNodes("x:form//@bedrag")  --> array van bedragen<br />
</code></p>
<p>(Tijdelijke) Work around om ook die single node uit te lezen.</p>
<p><code>' in plaats van naar domdocument40 te refereren:<br />
'Set xml_document.Schemas = schemaCache<br />
Set xml_document = New MSXML2.DOMDocument<br />
'Het xml_document valideren dmv de validate functie<br />
Validate sWorkFile, sSchemaFile</p>
<p>Private Function Validate(ByVal strXMLPath As String, _<br />
                              ByVal strXSDPath As String) As Boolean</p>
<p>        Dim objSchemas As MSXML2.XMLSchemaCache40<br />
        Dim objXML As MSXML2.DOMDocument40<br />
        Dim objXSD As MSXML2.DOMDocument40<br />
        Dim strNamespace As String<br />
        Dim objErr As MSXML2.IXMLDOMParseError</p>
<p>        ' load XSD as DOM to populate in Schema Cache<br />
        Set objXSD = New MSXML2.DOMDocument40<br />
        objXSD.async = False<br />
        If Not objXSD.Load(strXSDPath) Then<br />
            Err.Raise 1, "Validate", "Load XSD failed: " &#038; objXSD.parseError.reason<br />
        Else<br />
            ' get namespace name from XSD targetNamespace attribute<br />
            strNamespace = objXSD.documentElement.getAttribute("targetNamespace")<br />
        End If</p>
<p>        ' populate schema cache<br />
        Set objSchemas = New MSXML2.XMLSchemaCache40<br />
        objSchemas.Add strNamespace, objXSD</p>
<p>        ' load XML file (without validation - that comes later)<br />
        Set objXML = New MSXML2.DOMDocument40<br />
        objXML.async = False<br />
        objXML.validateOnParse = False<br />
        objXML.resolveExternals = False</p>
<p>        ' load XML, without any validation<br />
        If Not objXML.Load(strXMLPath) Then<br />
            Err.Raise 1, "Validate", "Load XML failed: " &#038; objXML.parseError.reason<br />
        End If</p>
<p>        ' bind Schema Cache to DOM<br />
        Set objXML.Schemas = objSchemas</p>
<p>        ' does this XML measure up?<br />
        Set objErr = objXML.Validate()</p>
<p>        ' any good?<br />
        Validate = (objErr.errorCode = 0)<br />
        If objErr.errorCode <> 0 Then<br />
            Err.Raise 1, "Validate", objErr.reason<br />
        End If</p>
<p>    End Function</code></p>
<p>En dit werkt dus wel. Ook al vind ik het maar een beetje viesjes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sietoebie.be/2008/12/04/xsd-en-xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
