Я понимаю, что это старый вопрос, однако я попробовал предоставленные ответы и не смог заставить их успешно работать в Powershell.
Я создал следующую функцию, которая использует некоторые из описанных здесь методов. Я нашел его очень надежным.
Мне пришлось проверять документы XML в разное время, однако я всегда считал, что номер строки равен 0. Кажется, что XmlSchemaException.LineNumber
будет доступен только при загрузке документа.
Если вы валидация впоследствии с помощью метода Validate()
на XmlDocument
затем LineNumber/LinePosition всегда будет 0.
Вместо этого вы должны сделать проверку при чтении с использованием XmlReader
и добавления обработчика событий проверки в блоке сценария ,
Function Test-Xml()
{
[CmdletBinding(PositionalBinding=$false)]
param (
[Parameter(ValueFromPipeline=$true, Mandatory=$true)]
[string] [ValidateScript({Test-Path -Path $_})] $Path,
[Parameter(Mandatory=$true)]
[string] [ValidateScript({Test-Path -Path $_})] $SchemaFilePath,
[Parameter(Mandatory=$false)]
$Namespace = $null
)
[string[]]$Script:XmlValidationErrorLog = @()
[scriptblock] $ValidationEventHandler = {
$Script:XmlValidationErrorLog += "`n" + "Line: $($_.Exception.LineNumber) Offset: $($_.Exception.LinePosition) - $($_.Message)"
}
$readerSettings = New-Object -TypeName System.Xml.XmlReaderSettings
$readerSettings.ValidationType = [System.Xml.ValidationType]::Schema
$readerSettings.ValidationFlags = [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessIdentityConstraints -bor
[System.Xml.Schema.XmlSchemaValidationFlags]::ProcessSchemaLocation -bor
[System.Xml.Schema.XmlSchemaValidationFlags]::ReportValidationWarnings
$readerSettings.Schemas.Add($Namespace, $SchemaFilePath) | Out-Null
$readerSettings.add_ValidationEventHandler($ValidationEventHandler)
try
{
$reader = [System.Xml.XmlReader]::Create($Path, $readerSettings)
while ($reader.Read()) { }
}
#handler to ensure we always close the reader sicne it locks files
finally
{
$reader.Close()
}
if ($Script:XmlValidationErrorLog)
{
[string[]]$ValidationErrors = $Script:XmlValidationErrorLog
Write-Warning "Xml file ""$Path"" is NOT valid according to schema ""$SchemaFilePath"""
Write-Warning "$($Script:XmlValidationErrorLog.Count) errors found"
}
else
{
Write-Host "Xml file ""$Path"" is valid according to schema ""$SchemaFilePath"""
}
Return ,$ValidationErrors #The comma prevents powershell from unravelling the collection http://bit.ly/1fcZovr
}
Почему именно вам нужен PowerShell только потому, что вы читаете список файлов из stdin? –
Я хотел бы иметь возможность легко интегрировать его в автоматизированные скрипты сборки. Не хотел компилировать приложение только для этого. Сценарий PowerShell казался естественным подспорьем для такого рода вещей. –