XML活用講座

XMLのチェックの仕方





概要

本ページでは、前回の「XMLの記述ルール」で説明したXMLについて、正しく記述できているかどうかのチェックを行う方法について説明します。XMLは簡単な記述ルールですが、手入力で作成したり、システムで自動作成するプログラムを開発するときに、ケアレスミスが起こることがあります。また、DTD(文書型定義)を指定してXML構造の独自ルールを設けている場合、そのDTDに合致しているかどうかをチェックする必要があります。

 

基本的な用語

XMLパーサー

XMLのチェックを行うには「XMLパーサー」(XML Parser)と呼ばれるソフトウェアを使うことが多いです。代表的なものとしてはMicrosoft社の「MSXML」があります。XMLパーサーを用いてXMLをパース(解析)してチェックを行うため、「パーサーチェック」などと言われます。

整形式XML文書

XMLの文法に従っているXML文書のことで、well-formed XML document とも記載します。DTDの指定が無い場合、あるいはDTD指定を無視した状態でチェックすることで確認できます。整形式XML文書の条件を満たしていなければXMLとして取り扱うことができません。

妥当なXML文書

上記の整形式XML文書を満たしつつ、指定されたDTDなどのスキーマ(文書型定義)の条件を満たしているXML文書のことで、valid XML document とも記載します。XHTMLやSVGなどのW3C定義のフォーマットやDITAなどの標準化団体が定義しているフォーマット、企業などの組織内で独自に定義しているフォーマットなど、用途に応じて利用者間で共有のフォーマットに適合しているかどうかをチェックします。

 

チェックの必要性

まず「整形式XML文書」に適合していなければXMLとして取り扱うことができません。しかし、「妥当なXML文書」でなくともDOMやXSLなどのXMLを制御するオブジェクトやエンジンでXMLを取り扱うことは可能です。一時的な処理や小規模な開発スケールでは、DTDやスキーマなどは必ずしも必要ではありません。
では、なぜ「妥当なXML文書」である必要があるのかについて記載します。それは、作成されたXMLをチェックすることよりも、作成されたXMLを処理するために必要となるからと思われます。
人間の目では「number」も「No.」も「番号」も同じような意味合いとして認識することができます。
しかし、ソフトウェアでは全パターンが同じものであるという定義が必要になります。自由に記述できるXMLの場合、データ処理の側で膨大なコストが必要となってしまいます。このため、DTDやスキーマという文書ルールの定義が必要になってきます。

 

チェックの仕方

XMLをチェックするパーサーチェックについて、ここでは「エディタ」・「VBScript」・「VB.Net」・「Webサイトツール」の4つについて紹介します。

エディタ

秀丸エディタとマクロを使ってチェックすることができます。「XMLパーサ for 秀丸エディタ」というマクロです。

 

hidemaru-xml-parser

 

また、現在は販売終了となっていますがアンテナハウス社の XML Editor なども当社では利用しております。
これらのエディタによるチェックには、「書く」と「チェックする」を交互に行える利便性があるため、XMLを手入力で作る時も、プログラム的にXMLを作って確認するときにも非常に便利です。

VBScript

VBScriptを使ったチェックツールでXMLの妥当性をチェックすることもできます。
簡単なサンプルコードを記載します。

Option Explicit
Dim objXML, rPath, i, strResult, objErr

If wscript.arguments.count > 0 Then
	For i = 0 to wscript.arguments.length - 1
		rPath = wscript.arguments.item(i)

		If LCASE(RIGHT(rPath, 4)) = ".xml" Then
			Set objXML = CreateObject("MSXML2.DOMDocument.6.0")

			objXML.setProperty "ProhibitDTD", False
			objXML.setProperty "ResolveExternals", True 
			objXML.validateOnParse = True

			objXML.async = False
			On Error Resume Next

			objXML.load(rPath)
			If objXML.parseError.errorCode <> 0 Then
				Set objErr = objXML.parseError
				strResult = objErr.reason
				strResult = strResult & vbNewLine
				strResult = strResult & objErr.line & "行目に記載されている次の記述を確認してください。"
				strResult = strResult & vbNewLine
				strResult = strResult & " " & objErr.srcText
				strResult = strResult & vbNewLine
				WScript.Echo strResult
			Else
				wscript.echo "true"
			End If

			On Error Goto 0
			Set objXML = Nothing
		End If

	Next
End If


 

メモ帳などのエディタに上記のソースコードをコピーして、「xml-parse.vbs」などのファイル名で保存します。このScriptファイルにチェックしたいXMLをドラッグ・アンド・ドロップすることでチェックできます。

!Note
実行いただくPC環境には Microsoft社の「Microsoft Core XML Services (MSXML) 6.0」をインストールしておく必要があります。インストール後はWindows Updateによる最新化も必要です。
ご利用結果については当社は一切責任を負わないものとします。

 

バッチファイルやコマンドラインから実行する場合は次のように記述します。
FNAMEの値に「AAA.xml」と記載すると、「AAA.xml.txt」としてチェック結果が出力されます。

SET FNAME=test.xml
cscript xml-parser.vbs "%FNAME%" > "%FNAME%.txt"

 

 

VB.Net

VB.Netからの場合、次のような記述でチェックすることができます。
Importsステートメントなどの記載は省略しておりますので、あらかじめご了承ください。

    Public Function xmlParserCheck(ByVal f As String, Optional ByVal isDTD As Boolean = True) As String
        Dim isValid As Boolean = True
        Dim rMsg As String = ""

        Dim r As XmlReader
        Dim v As New XmlReaderSettings
        v.ProhibitDtd = False
        v.ValidationType = ValidationType.DTD

        If isDTD = True Then
            r = XmlTextReader.Create(f, v)
        Else
            r = XmlTextReader.Create(f)
        End If

        Try
            While r.Read

            End While
        Catch ex As Exception
            isValid = False
            rMsg = ex.Message
        End Try
        r.Close()
        r = Nothing
        v = Nothing

        Return rMsg
    End Function

 

!Note
.NET Framework version 3.5 での動作を確認しています。
ご利用結果については当社は一切責任を負わないものとします。

 

 

Webサイトツール

「XML」と「チェック」などのキーワードでGoogleなどの検索エンジンで調べてみると、多くのWebサイト上でXMLをチェックするツールが見つかります。Webサイトの入力フォームにXMLデータを入力したり、XMLファイルそのものをアップロードすることでチェックできます。

!Note
小規模であったり一時的であっても、データをインターネット上にアップロードすることになりますので、ご利用いただく際はくれぐれもご注意ください。ご利用結果については当社は一切責任を負わないものとします。


ページTOPへ