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