如何使用 PowerShell 针对 XSD 验证 XML 文件? [英] How do I use PowerShell to Validate XML files against an XSD?

查看:25
本文介绍了如何使用 PowerShell 针对 XSD 验证 XML 文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

作为我开发的一部分,我希望能够针对单个 XSD 文件验证整个文件夹的 XML 文件价值.PowerShell 函数似乎是一个很好的候选者,因为我可以像这样通过管道将文件列表传递给它: dir *.xml |Validate-Xml -Schema .MySchema.xsd

As a part of my development I'd like to be able to validate an entire folder's worth of XML files against a single XSD file. A PowerShell function seems like a good candidate for this as I can then just pipe a list of files to it like so: dir *.xml | Validate-Xml -Schema .MySchema.xsd

我考虑过从 Validating an Xml against在 C# 中引用了 XSD 问题,但我不知道如何在 PowerShell 中添加处理程序.

I've considered porting C# code from the Validating an Xml against Referenced XSD in C# question, but I don't know how to Add handlers in PowerShell.

推荐答案

为此我写了一个 PowerShell 函数:

I wrote a PowerShell function to do this:

用法:

目录 *.xml |Test-Xml -Schema ".MySchemaFile.xsd" -Namespace "http://tempuri.org"

dir *.xml | Test-Xml -Schema ".MySchemaFile.xsd" -Namespace "http://tempuri.org"

代码:

function Test-Xml {
param(
    $InputObject = $null,
    $Namespace = $null,
    $SchemaFile = $null
)

BEGIN {
    $failCount = 0
    $failureMessages = ""
    $fileName = ""
}

PROCESS {
    if ($InputObject -and $_) {
        throw 'ParameterBinderStringsAmbiguousParameterSet'
        break
    } elseif ($InputObject) {
        $InputObject
    } elseif ($_) {
        $fileName = $_.FullName
        $readerSettings = New-Object -TypeName System.Xml.XmlReaderSettings
        $readerSettings.ValidationType = [System.Xml.ValidationType]::Schema
        $readerSettings.ValidationFlags = [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessInlineSchema -bor
            [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessSchemaLocation -bor 
            [System.Xml.Schema.XmlSchemaValidationFlags]::ReportValidationWarnings
        $readerSettings.Schemas.Add($Namespace, $SchemaFile) | Out-Null
        $readerSettings.add_ValidationEventHandler(
        {
            $failureMessages = $failureMessages + [System.Environment]::NewLine + $fileName + " - " + $_.Message
            $failCount = $failCount + 1
        });
        $reader = [System.Xml.XmlReader]::Create($_, $readerSettings)
        while ($reader.Read()) { }
        $reader.Close()
    } else {
        throw 'ParameterBinderStringsInputObjectNotBound'
    }
}

END {
    $failureMessages
    "$failCount validation errors were found"
}
}

这篇关于如何使用 PowerShell 针对 XSD 验证 XML 文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆