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 秀丸エディタ」というマクロです。

また、現在は販売終了となっていますがアンテナハウス社の 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 |
|---|
| 小規模であったり一時的であっても、データをインターネット上にアップロードすることになりますので、ご利用いただく際はくれぐれもご注意ください。ご利用結果については当社は一切責任を負わないものとします。 |

