2

カスタムツールボックスモジュールに関数を作成し、カスタムxmlファイルを使用して命令を提供するとします($xmlpathパラメーターを使用して渡されます)。入力が正しいxmlタイプ/構文/フォーマット(正しい要素、ルートノードなど)を使用していることを確認するにはどうすればよいですか?スキーマ(xsd)と名前空間について読みました(これを理解していませんでした)。

スキーマファイルを使用する場合:exを使用してxmlを検証するにはどうすればよいですか。Test-XML(PSCXコマンドレット)?xsdファイルをオンラインで保存し、そのパスをxmlドキュメントで指定しますか?モジュールフォルダーに保存し、スクリプトにハードコーディングしますか?もしそうなら、どのようにスキーマパスを指定しますか?コードサンプル:

#Stored in ..\Modules\MyModule\Process-Config.psm1)
function Process-Config
{
    param($xmlpath)
    #Test that file is xml
    try{ $xml = [xml](Get-Content $xmlpath) } catch {}

    #Test that xml-file is valid against schema in Module-folder (Modules\MyModule\xmlschema.xsd)
    #Using Test-XML PSCX cmdlet
    Test-XML -Path $xmlpath -SchemaPath #Schemapath#

}

編集:$ PSScriptRootがモジュールの場所を提供するので、パスとして$ PSScriptRoot \ Schemas\MySchema.xsdを使用できることがわかりました。スクリプトで動作すると思いましたが、関数も動作するようです。:-)それでも、このようなローカルファイルのxmlでスキーマを指定しますか?その場合、このローカルパスを指定するにはどうすればよいですか、またはxsdをオンラインで公開して、xmlファイルのスキーマアドレスとして使用する必要がありますか?

4

4 に答える 4

7

XML-Fileの基本的なテスト(XMLスキーマまたは外部モジュールへの依存関係を検証せずに)が必要な場合は、JonathanMeddの関数Test-XMLFileを使用できます。

function Test-XMLFile {
    <#
        .SYNOPSIS
        Test the validity of an XML file
    #>
    [CmdletBinding()]
    param (
        [parameter(mandatory=$true)][ValidateNotNullorEmpty()][string]$xmlFilePath
    )

    # Check the file exists
    if (!(Test-Path -Path $xmlFilePath)){
        throw "$xmlFilePath is not valid. Please provide a valid path to the .xml fileh"
    }
    # Check for Load or Parse errors when loading the XML file
    $xml = New-Object System.Xml.XmlDocument
    try {
        $xml.Load((Get-ChildItem -Path $xmlFilePath).FullName)
        return $true
    }
    catch [System.Xml.XmlException] {
        Write-Verbose "$xmlFilePath : $($_.toString())"
        return $false
    }
}

たくさんのXMLファイルをチェックしたい場合は、次のようなものを使用できます。

gci -recurse *.xml |% {
 $outcome = Test-XMLFile $_.FullName -Verbose
}

これにより、どのXMLファイルにどのような問題があるかがわかります。

于 2014-04-07T13:51:53.393 に答える
2

これはテストされていませんが、XMLを使用すると宣言しているスキーマと照合するために作成したユーティリティに基づいています。そのコアで、XmlReaderXSDベースの検証を実行するように構成されたものを作成し、参照されるスキーマをロードできるようにします。

$readerSettings = New-Object 'System.Xml.XmlReaderSettings';
$readerSettings.ValidationFlags = [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessInlineSchema -bor
                                  [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessSchemaLocation -bor
                                  [System.Xml.Schema.XmlSchemaValidationFlags]::ReportValidationWarnings -bor
                                  [System.Xml.Schema.XmlSchemaValidationFlags]::ProcessIdentityConstraints;
$readerSettings.ValidationType = [System.Xml.ValidationType]::Schema;

$results = @()

$valHandler = [System.Xml.Schema.ValidationEventHandler]{
  # $_ is the second argument of type System.Xml.ValidationEventArgs
  $script:results += "{0}: {1}" -f $_.Severity, $_.Message;
}

$readerSettings.add_ValidationEventHandler($valHandler)

$reader = [System.Xml.XmlReader]::Create($xmlFileName, $readerSettings);

while ($reader.Read()) {
  # Do nothing...
}

$results;  # Return the array of validation errors and warnings.

ノート:

  • リーダーの作成時とXMLの処理中の両方でスローされる可能性のある例外がいくつかあります(たとえば、無効なXML、参照されたスキーマが見つかりません)。
  • ここに示されているよりもはるかに多くの制御が利用可能であり、XmlReaderSettingsおよびValidationEventArgs(最初に​​)のドキュメントを確認することは有益です。
  • ファイルのスキーマ(XSD)を指定する一般的な方法は、{名前空間、XSD-schmea}ペアのリストを含むschemaLocation(名前空間からの)属性を使用することです。http://www.w3.org/2001/XMLSchema-instanceただしXmlReaderSettings.Schemas、ドキュメント外のスキーマを指定するためにも使用できます。
于 2013-01-20T22:49:21.177 に答える
1

スクリプトを実行する予定の各PCの既知のパスにXSDが保存されていない限り、XSDファイルへのファイルパスを指定します。XSDが相対パスを介して指定することをお勧めします。相対パスには、ええ、$PSScriptRootを使用します。

$xsd = $PSScriptRoot\schema.xsd
Test-Xml -XmlPath $xmlPath -SchemaPath $xsd
于 2013-01-21T03:01:53.657 に答える
0

XMLの有効性をプログラムの機能としてチェックするのか、サービスからチェックするのかはよくわかりません。

まず、XMLで学ぶことはたくさんあります。私が取り組んでいるリソースを見つけました。週末に、XMLを学びましょう。これが役立つかもしれません。一度にすべてを知る必要はありません。

これは、XMLドキュメントの有効性をチェックするオンラインサービスです。

プログラムでそれを実行できるようにする場合は、 xmlintのような種類のxmllintが必要だと思います。

最後に、APIのようなxml lintを使用するプログラムを作成する場合は、使用しているプログラミング言語を指定する必要があります。これが少しお役に立てば幸いです。乾杯!

于 2013-01-20T13:03:03.567 に答える