XML ドキュメントの読み取りと検証
InterSystems IRIS® データ・プラットフォームを使用すれば、XML ドキュメントをいくつかの方法で読み取って使用できます。このページでは、XML ドキュメントの概要を示し、XML ドキュメントの検証方法を説明します。
基本的な手法
InterSystems IRIS では、3 つの基本的な方法で XML ドキュメントを読み取って解析できます。
-
どの XML ドキュメントにも %XML.TextReaderOpens in a new tab を使用できます (別のトピックで説明しています)。この API を使用すると、ドキュメントを読み取ることで %XML.TextReaderOpens in a new tab のインスタンスが作成され、それを使用してドキュメントをノード単位で検査できます。
-
どの XML ドキュメントにも %XML.ReaderOpens in a new tab を使用して、XML ドキュメント・オブジェクト・モデル (DOM) としてアクセスできます。
-
XML ドキュメントが XML 対応のクラス定義に適切にマッピングされていれば、%XML.ReaderOpens in a new tab クラスを使用して、そのクラスのインスタンスにドキュメントをインポートできます (別のトピックで説明しています)。
%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 を使用します。
-
以下のメソッドのいずれかの最初の引数を使用して、ドキュメント・ソースを指定します。
メソッド 最初の引数 ParseFile() 完全なパスを含むファイル名ファイル名およびパスは ASCII 文字のみを含む必要があります。 ParseStream() ストリーム ParseString() 文字列 ParseURL() URL -
解析メソッドから返されたステータスを確認します。ステータスにエラー・コードがある場合、そのエラー・コードに問題の場所が示されています。
ドキュメントに複数のエラーが存在することがありますが、ドキュメントをこれ以上読み取ることができなくなった時点でパーサは終了します。
例 :
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 の使用" も参照してください。