Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

XML ドキュメントの読み取りと検証

InterSystems IRIS® を使用すれば、XML ドキュメントをいくつかの方法で読み取って使用できます。このページでは、XML ドキュメントの概要を示し、XML ドキュメントの検証方法を説明します。

基本的な手法

InterSystems IRIS では、3 つの基本的な方法で XML ドキュメントを読み取って解析できます。

%XML.TextReaderOpens in a new tab%XML.ReaderOpens in a new tab の両方で、InterSystems IRIS の SAX (Simple API for XML) パーサが使用されます。

ドキュメントが整形式であることの確認

XML ドキュメントを読み取るときは、同時に検証も実行することが一般的です。つまり、SAX パーサはドキュメントが整形式であることを確認し、必要に応じて他のタスクを実行すると共に、宣言済みのスキーマまたは DTD との照合によってドキュメントを検証します。

XML ドキュメントが整形式であるかどうかの確認のみが必要な場合は、以下のように %XML.TextReaderOpens in a new tab を使用します。

  1. 以下のメソッドのいずれかの最初の引数を使用して、ドキュメント・ソースを指定します。

    メソッド 最初の引数
    ParseFile() 完全なパスを含むファイル名ファイル名およびパスは ASCII 文字のみを含む必要があります。
    ParseStream() ストリーム
    ParseString() 文字列
    ParseURL() URL
  2. 解析メソッドから返されたステータスを確認します。ステータスにエラー・コードがある場合、そのエラー・コードに問題の場所が示されています。

    ドキュメントに複数のエラーが存在することがありますが、ドキュメントをこれ以上読み取ることができなくなった時点でパーサは終了します。

例 :

USER>set file="C:\0work\XMLdemo\inputfile2.xml"
 
USER>set status=##class(%XML.TextReader).ParseFile(file)
 
USER>write status=1
1
USER>set file="C:\0work\XMLdemo\inputfile2a.xml"
 
USER>set status=##class(%XML.TextReader).ParseFile(file)
 
USER>write status=1
0
USER>d $system.OBJ.DisplayError(status)
 
ERROR #6301: SAX XML Parser Error: expected end of tag 'xlistitem' while processing 
C:\0work\XMLdemo\inputfile2a.xml at line 423 offset 3

ドキュメントがスキーマまたは DTD に従っていることの確認

必要に応じ、%XML.TextReaderOpens in a new tab を使用して、宣言済みのスキーマまたは DTD との照合によってドキュメントを検証することもできます。そのためには、前のセクションで説明したように ParseFile()ParseStream()ParseString()、または ParseURL() を呼び出しますが、この場合は 2 番目の引数 TextReader も指定します。この引数は出力として返され、%XML.TextReaderOpens in a new tab のインスタンスです。この引数を使用してドキュメントを反復処理し、エラーと警告を検出できます。

例 :

ClassMethod ValidateFile(file As %String = "C:\0work\XMLdemo\inputfile2.xml",schema as %String="")
{
    write !!,"Validating "_file_"..."
    
    if (schema="") {
        //in this case, use the schema that the file refers to
        Set status=##class(%XML.TextReader).ParseFile(file,.tReader,,flags)
    } else {
        //use an override schema
        Set status=##class(%XML.TextReader).ParseFile(file,.tReader,,flags,,schema)
    }
    if $$$ISERR(status) {
        do $system.OBJ.DisplayError(status)
    }
    if '$ISOBJECT(tReader) {
        write !, ">>> Cannot read this file, because it is not valid..."
        quit
    }
    set errcount=0
    set warningcount=0
    while (tReader.Read()) {
        if (tReader.NodeType="error") {
            set errcount=errcount+1
            Write !, ">>> *ERROR* ",tReader.Value
        } elseif (tReader.NodeType="warning") {
            set warningcount=warningcount+1
            Write !, ">>> *WARNING* ",tReader.Value
        }
    }
    if (errcount=0) && (warningcount=0) {
        write !, ">>> No warnings or errors"
    }
}

以下の追加のメソッドを使用することで、ディレクトリにある各ファイルを再帰的にスキャンできます。

ClassMethod ValidateFilesInDir(dirtoprocess As %String = "C:\0work\XMLdemo",schema as %String="")
{
    set stmt = ##class(%SQL.Statement).%New()
    set status = stmt.%PrepareClassQuery("%File","FileSet")
    if $$$ISERR(status) { 
        do $system.OBJ.DisplayError(status)
        quit  
    }

    set rset = stmt.%Execute(dirtoprocess,"*.xml",,1)
    while rset.%Next() {
        set filetoprocess=rset.%Get("Name")
        set type=rset.%Get("Type")
        if (type="F") {
            do ..ValidateFile(filetoprocess,schema)
        } elseif (type="D") {
            set dirname=rset.%Get("Name")
            do ..ValidateFilesInDir(dirname)
        }
    }
}

"%XML.TextReader の使用" も参照してください。

FeedbackOpens in a new tab