-
-
Save iqbmo04/5c624891d589f6d64e526443b69f3dc8 to your computer and use it in GitHub Desktop.
ValidateXmlFile: a powershell script for validating XML
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| function ValidateXmlFile { | |
| param ([string]$xmlFile = $(read-host "Please specify the path to the Xml file")) | |
| $xmlFile = resolve-path $xmlFile | |
| "===============================================================" | |
| "Validating $xmlFile using the schemas locations specified in it" | |
| "===============================================================" | |
| # The validating reader silently fails to catch any problems if the schema locations aren't set up properly | |
| # So attempt to get to the right place.... | |
| pushd (Split-Path $xmlFile) | |
| try { | |
| $ns = @{xsi='http://www.w3.org/2001/XMLSchema-instance'} | |
| # of course, if it's not well formed, it will barf here. Then we've also found a problem | |
| # use * in the XPath because not all files begin with Configuration any more. We'll still | |
| # assume the location is on the root element | |
| $locationAttr = Select-Xml -Path $xmlFile -Namespace $ns -XPath */@xsi:noNamespaceSchemaLocation | |
| if ($locationAttr -eq $null) {throw "Can't find schema location attribute. This ain't gonna work"} | |
| $schemaLocation = resolve-path $locationAttr.Path | |
| if ($schemaLocation -eq $null) | |
| { | |
| throw "Can't find schema at location specified in Xml file. Bailing" | |
| } | |
| $settings = new-object System.Xml.XmlReaderSettings | |
| $settings.ValidationType = [System.Xml.ValidationType]::Schema | |
| $settings.ValidationFlags = $settings.ValidationFlags ` | |
| -bor [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessSchemaLocation | |
| $handler = [System.Xml.Schema.ValidationEventHandler] { | |
| $args = $_ # entering new block so copy $_ | |
| switch ($args.Severity) { | |
| Error { | |
| # Exception is an XmlSchemaException | |
| Write-Host "ERROR: line $($args.Exception.LineNumber)" -nonewline | |
| Write-Host " position $($args.Exception.LinePosition)" | |
| Write-Host $args.Message | |
| break | |
| } | |
| Warning { | |
| # So far, everything that has caused the handler to fire, has caused an Error... | |
| # So this /might/ be unreachable | |
| Write-Host "Warning:: " + $args.Message | |
| break | |
| } | |
| } | |
| } | |
| $settings.add_ValidationEventHandler($handler) | |
| $reader = [System.Xml.XmlReader]::Create($xmlfile, $settings) | |
| while($reader.Read()){} | |
| $reader.Close() | |
| } | |
| catch { | |
| throw | |
| } | |
| finally { | |
| popd | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment