JP2019125035A - 検証プログラム、検証装置および検証方法 - Google Patents

検証プログラム、検証装置および検証方法 Download PDF

Info

Publication number
JP2019125035A
JP2019125035A JP2018003561A JP2018003561A JP2019125035A JP 2019125035 A JP2019125035 A JP 2019125035A JP 2018003561 A JP2018003561 A JP 2018003561A JP 2018003561 A JP2018003561 A JP 2018003561A JP 2019125035 A JP2019125035 A JP 2019125035A
Authority
JP
Japan
Prior art keywords
tag
schema
verification
xml
code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2018003561A
Other languages
English (en)
Inventor
直人 大國
Naoto Okuni
直人 大國
片岡 正弘
Masahiro Kataoka
正弘 片岡
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2018003561A priority Critical patent/JP2019125035A/ja
Priority to US16/216,153 priority patent/US20190220502A1/en
Publication of JP2019125035A publication Critical patent/JP2019125035A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/14Tree-structured documents
    • G06F40/143Markup, e.g. Standard Generalized Markup Language [SGML] or Document Type Definition [DTD]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/126Character encoding
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/10Text processing
    • G06F40/12Use of codes for handling textual entities
    • G06F40/151Transformation
    • G06F40/157Transformation using dictionaries or tables
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F40/00Handling natural language data
    • G06F40/20Natural language analysis
    • G06F40/205Parsing
    • G06F40/226Validation

Abstract

【課題】複数のXML定義ファイルのXMLスキーマ検証において、高速に検証作業を行う。【解決手段】情報処理装置100は、複数のタグそれぞれのタグ名または定義値と、符号とを対応づけた符号化辞書131を用いて、検証対象の複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイル133を生成する。情報処理装置100は、複数のXML定義ファイルに対応したXMLスキーマから、符号化辞書131を用いて、スキーマ対応の転置インデックス132を生成する。情報処理装置100は、符号化XML定義ファイル133を、スキーマ対応の転置インデックス132を用いて検証する。【選択図】図3

Description

本発明は、検証プログラムなどに関する。
XML(Extensible Markup Language)形式のデータとしてXML定義ファイルがある。XML定義ファイルは、ユーザの資産として登録されるデータのファイルである。かかるXML定義ファイルは、XML定義ファイルの論理的構造を制約する定義が記述されたXMLスキーマを用いて検証される。
従来では、検証対象である複数のXML定義ファイルの検証は、以下のように行われる。例えば、検証処理は、検証対象であるXML定義ファイルごとの検証の度に、XMLスキーマを読み込み、XML定義ファイルの検証作業を行う。
特開2007−34827号公報 特開2013−246522号公報
しかしながら、複数のXML定義ファイルのXMLスキーマ検証では、高速に検証作業を行うことができないという問題がある。
ここで、複数のXML定義ファイルのXMLスキーマ検証では、高速に検証作業を行うことができないという問題について、図1を参照して説明する。図1は、XML定義ファイルのXMLスキーマ検証の参考例を示す図である。図1に示すように、複数のXML定義ファイルをXMLスキーマ検証する場合に、検証処理は、XML定義ファイルごとにXMLスキーマを読み込み、読み込んだXMLスキーマを用いてXML定義ファイルの検証作業を行う(x1)。したがって、検証処理は、検証するXML定義ファイルの数だけ、XMLスキーマを読み込み、XML定義ファイルの検証作業を繰り返す必要があるため、IO負荷およびCPU負荷が高くなる。この結果、複数のXML定義ファイルのXMLスキーマ検証では、高速に検証作業を行うことができない。なお、この後、検証に成功したXML定義ファイルは、圧縮され(x2)、圧縮データにより登録される。
1つの側面では、複数のXML定義ファイルのXMLスキーマ検証において、高速に検証作業を行うことを目的とする。
第1の案では、検証プログラムは、コンピュータに、複数のタグに関しタグ名または定義値と符号とを対応づけた符号化辞書を用いて、検証対象の複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイルを生成し、前記複数のXML定義ファイルに対応したスキーマから、前記符号化辞書を用いて、スキーマ対応インデックスを生成し、前記符号化XML定義ファイルを、前記スキーマ対応インデックスを用いて検証する、処理を実行させる。
一つの態様によれば、複数のXML定義ファイルのXMLスキーマ検証において、高速に検証作業を行うことができる。
図1は、XML定義ファイルのXMLスキーマ検証の参考例を示す図である。 図2は、実施例に係るXML定義ファイルのXMLスキーマ検証の一例を示す図である。 図3は、実施例に係る情報処理装置の構成を示す機能ブロック図である。 図4は、実施例に係る符号化辞書を説明する図である。 図5は、XMLスキーマの一例を示す図である。 図6は、実施例に係る転置インデックスのデータ構造の一例を示す図である。 図7は、実施例に係るインデックス生成処理の流れの一例を示す図である。 図8Aは、実施例に係るスキーマ検証処理の流れの一例を示す図(1)である。 図8Bは、実施例に係るスキーマ検証処理の流れの一例を示す図(2)である。 図8Cは、実施例に係るスキーマ検証処理の流れの一例を示す図(3)である。 図8Dは、実施例に係るスキーマ検証処理の流れの一例を示す図(4)である。 図8Eは、実施例に係るスキーマ検証処理の流れの一例を示す図(5)である。 図8Fは、実施例に係るスキーマ検証処理の流れの一例を示す図(6)である。 図9は、実施例に係るインデックス生成処理のフローチャートの一例を示す図である。 図10は、実施例に係るインデックス生成処理の具体例を示す図である。 図11は、実施例に係るスキーマ検証処理のフローチャートの一例を示す図である。 図12は、実施例に係る開始タグ処理のフローチャートの一例を示す図である。 図13は、実施例に係るXMLスキーマ検証の効果の一例を示す図である。 図14は、コンピュータのハードウェア構成例を示す図である。 図15は、コンピュータで動作するプログラムの構成例を示す図である。 図16は、実施形態のシステムにおける装置の構成例を示す図である。
以下に、本願の開示する検証プログラム、検証装置および検証方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
[実施例に係るXML定義ファイルのXMLスキーマ検証の一例]
図2は、実施例に係るXML定義ファイルのXMLスキーマ検証の一例を示す図である。
図2に示すように、XMLスキーマ検証処理は、複数のタグそれぞれのタグ名または定義値と、符号とを対応づけた符号化辞書を用いて、検証対象の複数のXML定義ファイルそれぞれを符号化したうえで統合した符号化XML定義ファイルを生成する(y1)。XMLスキーマ解析処理は、複数のXML定義ファイルに対応したXMLスキーマから、符号化辞書を用いて、XMLスキーマ対応の転置インデックスを生成する(y2)。
そして、XMLスキーマ検証処理は、符号化XML定義ファイルを、転置インデックスを用いて検証する(y3)。これにより、XMLスキーマ検証処理は、検証する符号化XML定義ファイルの数である1回だけ、XMLスキーマ対応の転置インデックスを読み込み、符号化XML定義ファイルの検証作業を行うことで、高速に検証作業を行うことができる。すなわち、XMLスキーマ検証処理は、複数のXML定義ファイルごとにXMLスキーマを読み込んで検証する場合と比較して、IO負荷およびCPU負荷が低くなり、高速に検証作業を行うことができる。
なお、XML定義ファイルとは、タグと定義値が混在したファイルである。タグとは、開始記号‘<’から始まり、終了記号‘>’で終わる文字列を指し、開始タグおよび終了タグを含む。例えば、XML定義ファイルのデータは、「<Endpoint><ServiceName>ser01</ServiceName></Endpoint>」である。このデータの中で、<Endpoint>が開始タグであり、</Endpoint>が終了タグである。このデータの中で、<ServiceName>が開始タグであり、</ServiceName>が終了タグである。このデータの中で、「ser01」は、開始タグから終了タグまでの要素(element)におけるコンテントであり、実施例ではコンテントというものとする。
[実施例に係る情報処理装置の構成]
図3は、実施例に係る情報処理装置の構成を示す機能ブロック図である。図3に示すように、情報処理装置100は、解析部110、検証部120および記憶部130を有する。
記憶部130は、例えばフラッシュメモリ(Flash Memory)やFRAM(登録商標)(Ferroelectric Random Access Memory)などの不揮発性の半導体メモリ素子などの記憶装置に対応する。記憶部130は、符号化辞書131、転置インデックス132および符号化XML定義ファイル133を有する。なお、転置インデックス132は、スキーマ対応インデックスの一例である。
符号化辞書131は、XMLスキーマおよびXML定義ファイルを符号化する際に用いられる辞書である。符号化辞書131は、一般的なXML定義ファイルやXMLスキーマなどを基にして、XML定義ファイルの中に出現するキーワードや定義値の出現頻度を特定し、出現頻度のより高いキーワードや定義値に対して、より短い符号を割り当てた辞書である。ここでいうキーワードとは、例えば、タグのタグ名のことをいう。定義値には、例えば、コンテント、タグのタイプ、データ型、出現回数などが含まれる。
ここで、符号化辞書131を、図4を参照して説明する。図4は、実施例に係る符号化辞書を説明する図である。図4には、符号化辞書131の一例として、分類ごとに、バイト数、符号化範囲、詳細分類およびXMLデータの具体例が記載されている。
分類には、高頻度キーワード、低頻度キーワードおよびユーザ定義値が示されている。1つの分類としての高頻度キーワードは、出現頻度の高いキーワードのことをいい、詳細分類で表わされる開始タグや終了タグが一例として挙げられる。1つの分類としての低頻度キーワードは、出現頻度の低いキーワードのことをいい、詳細分類で表わされる選択式の定義値や定義値の省略が一例として挙げられる。1つの分類としてのユーザ定義値は、出現頻度の低いキーワードのことをいい、詳細分類で表わされる任意入力の定義値が一例として挙げられる。
バイト数は、圧縮符号である符号コードのバイト数である。高頻度キーワードに対応するバイト数は、「1」である。低頻度キーワードに対応するバイト数は、「2」である。ユーザ定義値に対応するバイト数は、「2」または「3」である。
符号化範囲は、符号化可能な範囲である。高頻度キーワードに対応する符号化範囲は、「00h〜7Fh」である。低頻度キーワードに対応する符号化範囲は、「8000h〜8FFFh」である。ユーザ定義値に対応する符号化範囲は、バイト数が「2」である場合には、「9000h〜EFFFh」であり、バイト数が「3」である場合には、「F00000h〜FFFFFFh」である。
また、符号化範囲は、予めデータ型と対応付けても良い。例えば、「9000h〜EFFFh」のうち「9000h〜AFFFh」は、文字列型と対応付けても良い。「9000h〜EFFFh」のうち「B000h〜CFFFh」は、数値型と対応付けても良い、「9000h〜EFFFh」のうち「D000h〜EFFFh」は、日付型と対応付けても良い。
XMLデータの具体例には、分類ごとのキーワードや定義値の具体例が表わされる。高頻度キーワードに対応するXMLデータの具体例として、<Sequence>、</Sequence>、<Endpoint>、</Endpoint>が挙げられる。低頻度キーワードに対応するXMLデータの具体例として、「SyncServiceCall」や省略が挙げられる。ユーザ定義値に対応するXMLデータの具体例として、「calctest」や「soap_sync」が挙げられる。なお、高頻度キーワードおよび低頻度キーワードでは、それぞれの符号化範囲の符号コードとそれぞれのキーワードとが予め割り当てられ、登録されている。ユーザ定義値では、それぞれの符号化範囲の符号コードとそれぞれの定義値が予め割り当てられていない。符号化の際に、定義値が出現されたとき、符号コードが割り当てられ、登録される。
一例として、開始タグの一例である「<Sequence>」は、「00h」に割り当てられ、開始タグに対応する終了タグである「</Sequence>」は、「40h」に割り当てられる。また、開始タグの一例である「<Endpoint>」は、「05h」に割り当てられ、開始タグに対応する終了タグである「</Endpoint>」は、「45h」に割り当てられる。なお、実施例では、開始タグの符号は、「00h」〜「3Fh」であり、開始タグに対応する終了タグは、開始タグの符号に「40h」を加算して得られる値であるとする。
図3に戻って、転置インデックス132は、XMLスキーマに含まれるタグや定義値の出現位置を格納するためのインデックスである。すなわち、転置インデックス132とは、XMLスキーマに含まれるタグおよび定義値について、オフセット(出現位置)ごとの存否をインデックス化したビットマップのことをいう。
転置インデックス132のデータ元である「XMLスキーマ」は、XML定義ファイルの論理的構造を制約する定義が記述されたファイルのことをいい、XML定義ファイルの論理的構造の妥当性を検証するために用いられるファイルである。言い換えれば、XMLスキーマには、各タグに対するルールが記述されている。
ここで、XMLスキーマの一例を、図5を参照して説明する。図5は、XMLスキーマの一例を示す図である。図5に示すように、XMLスキーマには、タグに対するルールが記述されている。
例えば、“element name”(開始タグのタグ名)が“Sequence”である場合には、さらに、「xsd:complexType」のタグが記述されている。「xsd:complexType」とは、子要素を持つ要素(複雑型)であることを示す。また、「xsd:complexType」は、“Sequence”に関する性質を表す。したがって、“Sequence”と“complexType”とは、別のタグによって表現されているが、XML上同じ意味的な単位といえる。
また、“element name”(開始タグのタグ名)が“SequenceName”である場合には、出現回数やデータ型の情報が記述されている。出現回数の情報として、最小出現回数と最大出現回数とが記述されている。最小出現回数として1回であることを示す「minOccurs=“1”」、最大出現回数として1回であることを示す「maxOccurs=“1”」が記述されている。つまり、出現回数が1回であることを示す。「xsd:string」とは、文字列型であることを示す。
また、別の“element name”(開始タグのタグ名)が“Description”である場合には、最小出現回数として0回であることを示す「minOccurs=“0”」、最大出現回数として1回であることを示す「maxOccurs=“1”」が記述されている。つまり、出現回数が0〜1回であることを示す。データ型の情報として「xsd:string」が記述されている。
また、“element ref”(開始タグのタグ名)が“StepInformation”である場合には、タグ名として同値である“StepInformation”が定義されている箇所に、さらにルールが記述されていることを示す。ここでは、後方に記述された“element name=”StepInformation”(開始タグのタグ名)から最後尾の“/xsd:element”(終了タグのタグ名)までの情報が“StepInformation”のルールとしてさらに記述されている。
ここで、XMLスキーマの転置インデックス132のデータ構造の一例を、図6を参照して説明する。図6は、実施例に係る転置インデックスのデータ構造の一例を示す図である。図6に示すように、転置インデックス132のX軸はXMLスキーマのオフセット(出現位置)を表し、Y軸はタグ領域およびルール領域を備える。タグ領域には、開始タグおよび終了タグのタグ名とともに符号コードが設定される。タグ領域は、それぞれのタグ名について、XMLスキーマ内の出現位置に関するインデックスの束の情報である。ルール領域には、定義値とともに符号コードが設定される。ルール領域は、それぞれの定義値について、XMLスキーマ内の出現位置に関するインデックスの束の情報である。各タグ名、各定義値について、XMLスキーマ内に出現する出現位置には、出現ビットとしてONすなわち2進数の「1」が設定される。各タグ名、各定義値について、XMLスキーマ内に出現しない位置には、出現ビットとしてOFFすなわち2進数の「0」が設定される。なお、実施形態において、出現ビットが「0」の場合は、かかる「0」の記述を省略する。
一例として、出現位置が0番目に、タグ名として“Sequence”のビットがON、すなわち2進数の「1」を示す出現ビットが設定されている。また、定義値として“xsd:complexType”のビットがON、すなわち2進数の「1」を示す出現ビットが設定されている。
図3に戻って、符号化XML定義ファイル133は、検証対象の複数のXML定義ファイルそれぞれを符号化したうえで統合したファイルである。なお、符号化XML定義ファイル133は、後述する検証部120の符号化処理部122によって生成される。
解析部110は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、解析部110は、例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)等の集積回路の電子回路に対応する。または、解析部110は、CPU(Central Processing Unit)やMPU(Micro Processing Unit)等の電子回路に対応する。解析部110は、字句解析部111、符号化処理部112およびインデックス生成部113を有する。なお、字句解析部111、符号化処理部112およびインデックス生成部113は、第2の生成部の一例である。
字句解析部111は、XMLスキーマをタグごとに字句解析する。ここでいう字句解析とは、タグが示す文字列を、タグ名または定義値に分割することをいう。例えば、字句解析部111は、XMLスキーマを先頭から順番にタグを読み取る。すなわち、字句解析部111は、開始記号‘<’から始まり、終了記号‘>’で終わる文字列を示すタグを読み取る。そして、字句解析部111は、読み取ったタグを字句解析する。
符号化処理部112は、タグ名または定義値を符号化する。例えば、符号化処理部112は、字句解析部111から出力されるタグ名を、符号化辞書131を用いて符号コードに符号化する。また、符号化処理部112は、字句解析部111から出力される定義値を、符号化辞書131を用いて符号コードに符号化する。
インデックス生成部113は、XMLスキーマに含まれるタグおよび定義値それぞれについて、タグおよび定義値それぞれの出現位置を格納するための転置インデックス132を生成する。なお、1つの出現位置は、必ずしも1つのタグと対応するわけではなく、複数のタグがあってもXML上同じ意味的な単位であれば、複数のタグと対応する。例えば、インデックス生成部113は、タグに含まれるタグ名および定義値に対して、XMLスキーマ内の出現位置に対応する転置インデックス132の出現位置にビットを立てる。一例として、インデックス生成部113は、タグ名の場合には、タグ領域のタグ名に対して、XMLスキーマ内の出現位置に対応する転置インデックス132の出現位置にONを設定する。インデックス生成部113は、定義値の場合には、ルール領域の定義値に対して、XMLスキーマ内の出現位置に対応する転置インデックス132の出現位置にONを設定する。なお、該当するタグ名がタグ領域に無い場合には、インデックス生成部113は、タグ領域にタグ名とタグ名に対応する符号コードとを追加し、このタグ名に対応するインデックスを追加したうえで、出現位置にビットを立てれば良い。また、ルール領域については、インデックス生成部113は、予め、定義値と定義値に対して割り当てられた符号コードとを追加しておき、出現した際に、出現位置にビットを立てれば良い。
ここで、実施例に係るインデックス生成処理の流れの一例を、図7を参照して説明する。図7は、実施例に係るインデックス生成処理の流れの一例を示す図である。
まず、字句解析部111が先頭からタグを読み取ったとする。ここでは、<xsd:element name=“Sequence”>が読み取られたとする。図7に示すように、インデックス生成部113は、読み取られたタグのタグ種別が開始タグ且つ“element”であるので、タグ名に対して、XMLスキーマ内の出現位置に対応する転置インデックス132の出現位置に「1」を設定する(a1)。ここでは、タグ領域のタグ名“Sequence”に対して、XMLスキーマ内の出現位置「0」に対応する転置インデックス132の出現位置「0」に出現ビット「1」が設定される。なお、タグ名“Sequence”がタグ領域に無い場合には、インデックス生成部113は、タグ領域にタグ名と符号化処理部112によってタグ名を符号化した符号コードとを追加したうえで、出現位置に出現ビットを設定すれば良い。
次に、字句解析部111が次のタグを読み取ったとする。ここでは、<xsd:complexType>が読み取られたとする。インデックス生成部113は、読み取られたタグのタグ種別が開始タグ且つ“complexType”であるので、“complexType”に対して、XMLスキーマ内の出現位置に対応する転置インデックス132の出現位置に「1」を設定する(a2)。ここでは、タグ領域のタグ名“complexType”に対して、XMLスキーマ内の出現位置「0」に対応する転置インデックス132の出現位置「0」に出現ビット「1」が設定される。なお、タグ名“complexType”がタグ領域に無い場合には、インデックス生成部113は、タグ領域にタグ名と符号化処理部112によってタグ名を符号化した符号コードとを追加したうえで、出現位置に出現ビットを設定すれば良い。
ここで、タグ名“complexType”の出現位置がタグ名“Sequence”と同じ「0」であるのは、“complexType”と“Sequence”とはXML上同じ意味的な単位であるからである。すなわち、“Sequence”と“complexType”とは別のタグによって表現されているが、“complexType”は“Sequence”に関する性質を表すので、XML上同じ意味的な単位となる。したがって、“complexType”と“Sequence”とは、同一の出現位置で表現される。
次に、字句解析部111が次のタグを読み取ったとする。ここでは、<xsd:element name=“SequenceName”minOccurs=“1”maxOccurs=“1”type=“xsd:string”/>が読み取られたとする。インデックス生成部113は、読み取られたタグのタグ種別が単独タグ且つ“element name”であるので、タグ名に対して、XMLスキーマ内の出現位置に対応する転置インデックス132の出現位置に「1」を設定する(a3)。ここでは、タグ領域のタグ名“SequenceName”に対して、XMLスキーマ内の出現位置「1」に対応する転置インデックス132の出現位置「1」に出現ビット「1」が設定される。
加えて、インデックス生成部113は、タグに含まれる出現回数およびデータ型に対して、転置インデックス132の出現位置に「1」を設定する。ここでは、出現回数を示す「minOccurs=“1”maxOccurs=“1”」について、ルール領域の「1回」に対して、XMLスキーマ内の出現位置「1」に対応する転置インデックス132の出現位置「1」に出現ビット「1」が設定される(a5)。データ型を示す「“xsd:string”」について、ルール領域の「xsd:string」に対して、XMLスキーマ内の出現位置「1」に対応する転置インデックス132の出現位置「1」に出現ビット「1」が設定される(a4)。
なお、次の出現位置に存在するタグに含まれる「minOccurs=“0”maxOccurs=“1”」は、出現回数が0〜1回であることを示すので、ルール領域の「0〜1回」に対する転置インデックス132に出現ビット「1」が設定される(a6)。
このように、インデックス生成部113は、順次読み取られたタグから、符号化辞書131を用いて、転置インデックス132を生成する。
図3に戻って、検証部120は、各種の処理手順を規定したプログラムや制御データを格納するための内部メモリを有し、これらによって種々の処理を実行する。そして、検証部120は、例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)等の集積回路の電子回路に対応する。または、検証部120は、CPU(Central Processing Unit)やMPU(Micro Processing Unit)等の電子回路に対応する。検証部120は、字句解析部121、符号化処理部122およびスキーマ検証部123を有する。なお、字句解析部121および符号化処理部122は、第1の生成部の一例である。スキーマ検証部123は、検証部の一例である。
字句解析部121は、複数のXML定義ファイルを字句解析する。ここでいう字句解析とは、複数のXML定義ファイルに含まれる文字列を、タグ名または定義値に分割することをいう。そして、字句解析部121は、字句解析した結果のタグ名または定義値を、順番に符号化処理部122に出力する。
符号化処理部122は、タグ名または定義値を符号化する。例えば、符号化処理部122は、字句解析部121から出力されるタグ名を、符号化辞書131を用いて符号コードに符号化する。また、符号化処理部122は、字句解析部121から出力される定義値を、符号化辞書131を用いて符号コードに符号化する。そして、符号化処理部122は、複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイル133を生成する。
スキーマ検証部123は、符号化XML定義ファイル133を、転置インデックス132を用いて検証する。
例えば、スキーマ検証部123は、符号化XML定義ファイル133から順次1バイトずつ符号コードを読み取る。スキーマ検証部123は、読み取った符号コードのコード種別を判定する。ここでいうコード種別とは、例えば、コードが1バイトのコードであるか、2バイトのコードであるかのコードの種別を表す。スキーマ検証部123は、コード種別が1バイトのコード種別であると判定した場合には、さらに、タグ種別が開始タグであるか否かを判定する。なお、符号コードのコード種別が1バイトのコード種別であるか否かは、符号化辞書131を参照すれば良い。符号コードのタグ種別が開始タグであるか否かは、開始タグの符号が「00h」〜「3Fh」であると定義した場合には、符号コードが「00h」〜「3Fh」であるか否かで判定すれば良い。
スキーマ検証部123は、読み取った符号コードのタグ種別が開始タグであると判定した場合には、以下の処理を行う。
スキーマ検証部123は、スタックが空である場合には、自己の開始タグに対応する終了タグをスタックの最上位にプッシュする。ここでいう「スタック」とは、LIFO(Last In First Out)のデータ構造で要素を保持し、現に検証中の開始タグに対応する終了タグを保持する。保持された要素に検証すべきルールが紐付けられるものとする。そして、スキーマ検証部123は、自己の開始タグがcomplexTypeである場合には、転置インデックス132を参照し、自己の開始タグと終了タグとで挟まれた出現ビットが立っている要素(タグ領域のタグおよびルール領域のルール)をスタックの最上位の要素と紐付ける。自己の開始タグがcomplexTypeであり、子要素を持つ要素(複雑型)であるからである。スキーマ検証部123は、自己の開始タグがcomplexTypeでない場合には、自己の開始タグのデータ型などのタイプをスタックの最上位の要素と紐付ける。
スキーマ検証部123は、スタックが空でない場合には、スタックの最上位の要素のタイプがcomplexTypeであれば、転置インデックス132を参照し、自己の開始タグがスタックの最上位の要素より先に出現されているかを判定する。スキーマ検証部123は、自己の開始タグがスタックの最上位の要素より先であれば、自己の開始タグの位置は妥当であると判断し、スタックの最上位の要素に紐付けられた要素を使って検証する。スキーマ検証部123は、自己の開始タグについて、検証に成功した場合には、スタックの最上位の要素に紐付けられた要素を更新する。一例として、スキーマ検証部123は、スタックの最上位の要素に紐付けられた要素のうち検証に成功した要素を削除する。そして、スキーマ検証部123は、自己の開始タグに対応する終了タグをスタックの最上位にプッシュする。スキーマ検証部123は、自己の開始タグがcomplexTypeである場合には、転置インデックス132を参照し、自己の開始タグと終了タグとで挟まれた出現ビットが立っている要素(タグ領域のタグおよびルール領域のルール)をスタックの最上位の要素に紐付ける。自己の開始タグがcomplexTypeであり、子要素を持つ要素(複雑型)であるからである。スキーマ検証部123は、自己の開始タグがcomplexTypeでない場合には、自己の開始タグのデータ型などのタイプをスタックの最上位の要素と紐付ける。
スキーマ検証部123は、読み取った符号コードのタグ種別が終了タグであると判定した場合には、以下の処理を行う。スキーマ検証部123は、自己の終了タグの符号コードとスタックの最上位の要素の符号コードとを照合し、一致していれば、自己の終了タグの位置は妥当であると判断し、スタックの最上位の要素のタイプに基づいて、自己の終了タグを検証する。
スキーマ検証部123は、読み取った符号コードのコード種別が2,3バイトのコード種別であると判定した場合には、以下の処理を行う。スキーマ検証部123は、符号化XML定義ファイル133から残りのバイト数の符号コードを読み取る。スキーマ検証部123は、読み取った2,3バイト分の符号コードのタイプがスタックの最上位の要素のタイプと一致していれば、自己の2,3バイトコードの検証は妥当であると判断し、スタックの最上位の要素に紐づくタイプを「検証済み」のステータスに更新する。スキーマ検証部123は、読み取った2,3バイト分の符号コードがスタックの最上位の要素のタイプと一致していなければ、自己の2,3バイトコードの検証は異常であると判断する。なお、2,3バイト分の符号コードのタイプは、例えば、符号化辞書131の符号化範囲に対応付けられるデータ型により判断されれば良い。
ここで、実施例に係るスキーマ検証処理の流れの一例を、図8A〜図8Fを参照して説明する。図8A〜図8Fは、実施例に係るスキーマ検証処理の流れの一例を示す図である。なお、図8A〜図8Fでは、検証対象の符号化XML定義ファイル133には、符号コード群として「050694D34645」が設定されているものとする。
図8Aに示すように、スキーマ検証部123が、検証対象の先頭から1バイトを読み取る。ここでは、読み取られた1バイトは「05h」であるとする。スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが高頻度キーワードであり、1バイトのコード種別であると判定する(b1)。また、スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが「00h」〜「3Fh」であり、タグ種別が開始タグであると判定する。
スキーマ検証部123は、読み取られた1バイトの符号コードのタグ種別が開始タグであるので、以下の処理を行う。スキーマ検証部123は、スタックSにはまだ要素が保持されていない(空である)ので、開始タグに対応する終了タグをスタックSにプッシュする(b2)。ここでは、読み取られた1バイトの符号コードが「05h」であるので、スキーマ検証部123は、「05h」に「40h」を加えた「45h」を終了タグとしてスタックSにプッシュする。
スキーマ検証部123は、転置インデックス132を参照し、自己の開始タグがcomplexTypeであると判定する(b3)。そこで、スキーマ検証部123は、自己の開始タグがcomplexTypeであることを、自己の開始タグに対応する終了タグに紐付ける。ここでは、一例として、自己の開始タグ「05h」がcomplexTypeであることは、スタックSにプッシュされた終了タグ「45h」に紐付けられる。
スキーマ検証部123は、自己の開始タグがcomplexTypeであるので、転置インデックス132を参照し、自己の開始タグと終了タグとで挟まれた範囲をスタックSの最上位の要素と紐付ける(b4)。すなわち、スキーマ検証部123は、自己の開始タグと終了タグとで挟まれた出現ビットが立っている要素(タグ領域のタグおよびルール領域のルール)をスタックSの最上位の要素と紐付ける。ここでは、タグ領域のタグ「06h」と、ルール領域の「81h」および「A2h」とが、開始タグと終了タグとで挟まれた範囲としてスタックSの最上位の要素「45h」と紐付けられる。「06h」は、「ServiceName」のタグの符号コードである。「81h」は、データ型として「xsd:string」のルールの符号コードである。「A2h」は、出現回数として「1回」のルールの符号コードである。
図8Bに示すように、スキーマ検証部123は、検証対象から次の1バイトを読み取る。ここでは、読み取られた1バイトは「06h」であるとする。スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが高頻度キーワードであり、1バイトのコード種別であると判定する(b5)。また、スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが「00h」〜「3Fh」であり、タグ種別が開始タグであると判定する。
スキーマ検証部123は、読み取られた1バイトの符号コードのタグ種別が開始タグであるので、以下の処理を行う。スキーマ検証部123は、スタックSには既に要素が保持され、スタックSの最上位の要素のタイプがcomplexTypeであるので、自己の開始タグの出現位置とスタックSの最上位の要素の出現位置とを探索する(b6)。ここでは、自己の開始タグ「06h」が最上位の要素「45h」より先に出現しているので、自己の開始タグ「06h」の検証対象内の位置は妥当であると判断する。
さらに、スキーマ検証部123は、自己の開始タグを、スタックSの最上位の要素に紐付けられた要素を用いて検証する(b7)。ここでは、スタックSの最上位の要素に紐付けられた要素を用いると、自己の開始タグ「06h」が「1回」出現できるので、自己の開始タグ「06h」について、「1回」の出現回数は妥当であると判断する。
そこで、スキーマ検証部123は、自己の開始タグについて、スタックSの最上位の要素に紐付けられた要素を更新する(b8)。ここでは、スタックSの最上位の要素に紐付けられた要素のうち検証に成功した要素「06h」の列を更新する。図8bに示される例では、検証対象はA2h(1回)のみであるので、「06h」に関する検証はここで終了し、06hの列に関連した要素である「06h」「81h」および「A2h」が削除される。
そして、スキーマ検証部123は、自己の開始タグに対応する終了タグをスタックSの最上位にプッシュする。加えて、スキーマ検証部123は、自己の開始タグがcomplexTypeでないので、スタックSの最上位の要素に自己の開始タグのタイプを紐付ける(b9)。ここでは、スキーマ検証部123は、自己の開始タグ「06h」に「40h」を加えた「46h」を終了タグとしてスタックSにプッシュする。スキーマ検証部123は、スタックSの最上位の要素「46h」に自己の開始タグ「06h」のタイプとして「81h」(文字列型)を紐付ける。
図8Cに示すように、スキーマ検証部123は、検証対象から次の1バイトを読み取る。ここでは、読み取られた1バイトは「94h」であるとする。スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイト「94h」が2バイトのコード種別であると判定するので、2バイト分を読み込む(b10−1)。読み取られた2バイトは「94D3h」であるとする。
スキーマ検証部123は、読み取った2バイトの符号コードのタイプとスタックSの最上位の要素のタイプとを照合し、一致していれば、自己の2バイトの符号コードの検証は妥当であると判断する(b10−2)。ここでは、自己の2バイトの符号コード「94D3h」のタイプは、符号化辞書131から文字列型であることがわかるので、スタックSの最上位の要素のタイプ「xsd:string」と一致する。したがって、スキーマ検証部123は、自己の2バイトの符号コード「94D3h」の検証は妥当であると判断する。
そして、スキーマ検証部123は、一致していれば、スタックSの最上位の要素に紐づくタイプを「検証済み」のステータスに変更する(b11)。
図8Dに示すように、スキーマ検証部123は、検証対象から次の1バイトを読み取る。ここでは、読み取られた1バイトは「46h」であるとする。スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが高頻度キーワードであり、1バイトのコード種別であると判定する(b12)。また、スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが「40h」〜「7Fh」であり、タグ種別が終了タグであると判定する。
スキーマ検証部123は、自己の終了タグの符号コードとスタックSの最上位の要素の符号コードとを照合し、一致していれば、スタックSの最上位の要素のタイプがComplexTypeか、「検証済み」か、それ以外であるか否かを判定する(b13)。ここでは、自己の終了タグの符号コードとスタックSの最上位の要素の符号コードとは共に「46h」であるので、照合は一致する。そして、スタックSの最上位の要素のタイプは、ComplexTypeでなく且つ「検証済み」である。したがって、スキーマ検証部123は、自己の終了タグの検証は妥当であると判断する。
スキーマ検証部123は、スタックSの最上位の要素をポップする(b14)。この結果、スタックSの最上位の要素(符号コード「46h」)が削除される。そして、スタックSの最上位の要素は、符号コード「45h」となる。
図8Eに示すように、スキーマ検証部123は、検証対象から次の1バイトを読み取る。ここでは、読み取られた1バイトは「45h」であるとする。スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが高頻度キーワードであり、1バイトのコード種別であると判定する(b15)。また、スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが「40h」〜「7Fh」であり、タグ種別が終了タグであると判定する。
スキーマ検証部123は、自己の終了タグの符号コードとスタックSの最上位の要素の符号コードとを照合し、一致していれば、スタックSの最上位の要素のタイプがComplexTypeか、「検証済み」か、それ以外であるか否かを判定する(b16)。ここでは、自己の終了タグの符号コードとスタックSの最上位の要素の符号コードとは共に「45h」であるので、照合は一致する。そして、スタックSの最上位の要素のタイプは、ComplexTypeである。そこで、スキーマ検証部123は、スタックSの最上位の要素にまだ検証が済んでいないルール(未検証のルール)が紐づいているか否かを判定する(b17)。ここでは、スタックSの最上位の要素に未検証のルールが紐付いていない。したがって、スキーマ検証部123は、自己の終了タグの検証は妥当であると判断する。
スキーマ検証部123は、スタックSの最上位の要素をポップする(b18)。この結果、スタックSの最上位の要素(符号コード「45h」)が削除される。
スキーマ検証部123は、この時点で符号化XML定義ファイル133の末尾に到達し、スタックSが空なので、検証に成功したと判定する。
図8Fは、図8Dに対応した、異常終了となる場合のスキーマ検証処理の流れの一例を示す図である。
図8Fに示すように、スキーマ検証部123は、検証対象から次の1バイト「46h」を読み取り、1バイトのコード種別であると判定する(b12)。また、スキーマ検証部123は、符号化辞書131を参照し、読み取られた1バイトの符号コードが「40h」〜「7Fh」であり、タグ種別が終了タグであると判定する。
スキーマ検証部123は、自己の終了タグの符号コードとスタックSの最上位の要素の符号コードとを照合し、一致していれば、スタックSの最上位の要素のタイプがComplexTypeか、「検証済み」か、それ以外であるか否かを判定する(b13´)。ここでは、自己の終了タグの符号コードとスタックSの最上位の要素の符号コードとは共に「46h」であるので、照合は一致する。そして、スタックSの最上位の要素のタイプは、ComplexTypeでなく、「検証済み」でなく、それ以外である。したがって、スキーマ検証部123は、自己の終了タグの検証は妥当でないと判断する。つまり、スキーマ検証部123は、スキーマ検証処理が異常終了であると判定する。
[インデックス生成処理のフローチャート]
図9は、実施例に係るインデックス生成処理のフローチャートの一例を示す図である。なお、以下では、図10に示されるXMLスキーマ、転置インデックス132を適宜用いながら説明する。
図9に示すように、インデックス生成部113は、転置インデックス132を初期化する(ステップS11)。なお、インデックス生成部113は、この時点で、転置インデックス132のルール領域の定義値に対して符号コードを割り当てる。
インデックス生成部113は、XMLスキーマファイルを入力する(ステップS12)。インデックス生成部113は、XMLスキーマファイルの末尾に到達するまで、XMLスキーマファイルからタグを読み取る(ステップS13)。
インデックス生成部113は、タグ種別が開始タグか、終了タグか、単独タグかを判定する(ステップS14)。タグ種別が開始タグであると判定した場合には(ステップS14;開始タグ)、インデックス生成部113は、タグ種別がcomplexTypeか、elementか、それ以外かを判定する(ステップS15)。
ステップS15において、タグ種別がelementであると判定した場合には(ステップS15;element)、インデックス生成部113は、name属性の値を転置インデックス132にマークする(ステップS17)。なお、インデックス生成部113は、転置インデックス132のタグ領域にname属性の値が存在していなければ、符号化処理部112を介して、name属性の値に対する開始タグと終了タグとの符号コードを割り当てる。ここでは、図10において、例えば、<xsd:element name=“Sequence”>のタグが読み取られた場合には、このタグが開始タグであり、タグ種別がelementであるので、以下の処理が行われる。インデックス生成部113は、name属性の値「Sequence」に対する開始タグと終了タグとの符号コードを「00h」と「40h」とに割り当て、タグ領域に追加する。インデックス生成部113は、転置インデックス132について、出現位置として「0」、符号コードとして「00h」のビットに出現ビット「1」をマークする(m1)。そして、インデックス生成部113は、次のタグを読み取るべく、ステップS13に移行する。
ステップS15において、タグ種別がcomplexTypeであると判定した場合には(ステップS15;complexType)、インデックス生成部113は、complexTypeであることを転置インデックス132にマークする(ステップS16)。ここでは、図10において、例えば、<xsd:complexType>のタグが読み取られた場合には、このタグが開始タグであり、タグ種別がcomplexTypeであるので、以下の処理が行われる。インデックス生成部113は、転置インデックス132について、出現位置として「0」、complexTypeの符号コードとして「80h」のビットに出現ビット「1」をマークする(m2)。出現位置が“Sequence”と同じ「0」であるのは、“Sequence”と“complexType”とが、別のタグによって表現されているが、XML上同じ意味的な単位だからである。そして、インデックス生成部113は、転置インデックス132上の出現位置のカーソルを1列進めるべく、ステップS26に移行する。
ステップS15において、タグ種別がそれ以外であると判定した場合には(ステップS15;それ以外)、インデックス生成部113は、何もしない。ここでは、図10において、例えば、<xsd:sequence>のタグが読み取られた場合には、このタグが開始タグであり、タグ種別がelementでなく、complexTypeでないので、インデックス生成部113は、何もしない。そして、インデックス生成部113は、次のタグを読み取るべく、ステップS13に移行する。
ステップS14において、タグ種別が単独タグであると判定した場合には(ステップS14;単独タグ)、インデックス生成部113は、タグの属性(XMLの属性と同義、以下、同じ)がnameか、refかを判定する(ステップS18)。
ステップS18において、タグの属性がnameであると判定した場合には(ステップS18;name)、インデックス生成部113は、element nameを転置インデックス132にマークする(ステップS19)。なお、インデックス生成部113は、転置インデックス132のタグ領域にelement nameが存在していなければ、符号化処理部112を介して、element nameに対する開始タグと終了タグとの符号コードを割り当てる。ここでは、図10において、例えば、<xsd:element name=“SequenceName” minOccurs=“1” maxOccurs=“1” type=“xsd:string”/>のタグが読み取られたとする。かかる場合には、このタグが単独タグであり、タグの属性がnameであるので、以下の処理が行われる。インデックス生成部113は、name属性の値「SequenceName」に対する単独タグの符号コード「30h」を割り当て、タグ領域に追加する。インデックス生成部113は、転置インデックス132について、出現位置として「1」、符号コードとして「30h」のビットに出現ビット「1」をマークする(m1)。
さらに、インデックス生成部113は、出現回数およびタイプを転置インデックス132にマークする(ステップS20)。ここでは、図10において、タグには、「minOccurs=“1” maxOccurs=“1” type=“xsd:string”」が含まれている。インデックス生成部113は、転置インデックス132について、出現位置として「1」、出現回数「1回」の符号コードとして「A2h」のビットに出現ビット「1」をマークする(m5)。インデックス生成部113は、転置インデックス132について、出現位置として「1」、タイプ「xsd:string」の符号コードとして「81h」のビットに出現ビット「1」をマークする(m4)。そして、インデックス生成部113は、転置インデックス132上の出現位置のカーソルを1列進めるべく、ステップS26に移行する。
ステップS18において、タグの属性がrefであると判定した場合には(ステップS18;ref)、インデックス生成部113は、出現回数を転置インデックス132にマークする(ステップS21)。ここでは、図10において、例えば、<xsd:element ref=“StepInformation” minOccurs=“0” maxOccurs=“unbounded”/>のタグが読み取られたとする。かかる場合には、このタグが単独タグであり、タグの属性がrefであるので、以下の処理が行われる。タグには、「minOccurs=“0” maxOccurs=“unbounded”」が含まれている。インデックス生成部113は、転置インデックス132について、出現位置として「3」、出現回数「0回以上」の符号コードとして「A0h」のビットに出現ビット「1」をマークする(m6)。
さらに、インデックス生成部113は、現在の行を記憶し、同じ定義値がelement nameで定義されている箇所を探してXMLスキーマファイル内の行に遷移を行う(ステップS22)。ここでは、図10において、例えば、出現位置がkの箇所に、定義値として“StepInformation”を示す開始タグが発見される。インデックス生成部113は、<xsd:element name=“StepInformation”>のタグの箇所に行を移動する。
そして、インデックス生成部113は、出現位置がkの箇所の開始タグから出現位置がlの箇所の終了タグまでの範囲について、S13〜S26のループを再帰的に繰り返す(ステップS23)。ステップS22で記憶された遷移元の行に移動する(ステップS23−1)。そして、インデックス生成部113は、転置インデックス132上の出現位置のカーソルを1列進めるべく、ステップS26に移行する。
ステップS14において、タグ種別が終了タグであると判定した場合には(ステップS14;終了タグ)、インデックス生成部113は、タグ種別がelementか、element以外かを判定する(ステップS24)。
ステップS24において、タグ種別がelementであると判定した場合には(ステップS24;element)、インデックス生成部113は、終了タグであることを転置インデックス132にマークする(ステップS25)。
ここでは、図10において、一例として、出現位置がlである箇所で、</xsd:element>のタグが読み取られた場合には、このタグが終了タグであり、タグ種別がelementであるので、以下の処理が行われる。インデックス生成部113は、転置インデックス132について、出現位置として「l」、終了タグの符号コードとして「41h」のビットに出現ビット「1」をマークする(m7)。そして、XMLスキーマファイル内の行の位置が呼び出し元(ref)に戻る。
また、別の一例として、出現位置がnである箇所で、</xsd:element>のタグが読み取られた場合には、このタグが終了タグであり、タグ種別がelementであるので、以下の処理が行われる。インデックス生成部113は、転置インデックス132について、出現位置として「n」、終了タグの符号コードとして「40h」のビットに出現ビット「1」をマークする(m8)。
そして、インデックス生成部113は、転置インデックス132上の出現位置のカーソルを1列進めるべく、ステップS26に移行する。
ステップS24において、タグ種別がelementでないと判定した場合には(ステップS24;element以外)、インデックス生成部113は、何もしない。ここでは、図10において、例えば、</xsd:sequence>のタグが読み取られた場合には、このタグが終了タグであり、タグ種別がelementでないので、インデックス生成部113は、何もしない。そして、インデックス生成部113は、次のタグを読み取るべく、ステップS13に移行する。
そして、ステップS13において、インデックス生成部113は、XMLスキーマファイルの末尾に到達すると、インデックス生成処理を終了する。
[スキーマ検証処理のフローチャート]
図11は、実施例に係るスキーマ検証処理のフローチャートの一例を示す図である。なお、XML定義ファイルは、符号化処理部122によって符号化処理され、符号化XML定義ファイル133に変換されたものとする。
スキーマ検証部123は、空のスタックSを記憶部130に用意する(ステップS31)。符号化XML定義ファイル133を受け取ったスキーマ検証部123は、符号化XML定義ファイル133の末尾に到達するまで、1バイトを読み取る(ステップS32)。
1バイトを読み取ったスキーマ検証部123は、読み取った1バイトの符号コードのコード種別を判定する(ステップS33)。コード種別が1バイトのコード種別であると判定した場合には(ステップS33;1バイトコード)、スキーマ検証部123は、タグ種別を判定する(ステップS34)。
タグ種別が開始タグであると判定した場合には(ステップS34;開始タグ)、スキーマ検証部123は、開始タグ処理を実行する(ステップS35)。なお、開始タグ処理のフローチャートは、後述する。そして、スキーマ検証部123は、次の1バイトを読み取るべく、ステップS44を介してステップS32に移行する。
一方、タグ種別が終了タグであると判定した場合には(ステップS34;終了タグ)、スキーマ検証部123は、当該終了タグの符号コードとスタックSの最上位の要素とを比較する(ステップS39)。終了タグの符号コードとスタックSの最上位の要素とが不一致である場合には(ステップS39;不一致)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
終了タグの符号コードとスタックSの最上位の要素とが一致する場合には(ステップS39;一致)、スキーマ検証部123は、スタックSの最上位の要素のタイプを判定する(ステップS40)。最上位のタイプが「検証済み」であると判定した場合には(ステップS40;「検証済み」)、スキーマ検証部123は、スタックSの要素をポップすべく、ステップS42に移行する。
最上位のタイプがcomplexTypeであると判定した場合には(ステップS40;complexType)、スキーマ検証部123は、未検証のルールが有るか否かを判定する(ステップS41)。未検証のルールが有ると判定した場合には(ステップS41;有る)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
一方、未検証のルールが無いと判定した場合には(ステップS41;無い)、スキーマ検証部123は、スタックSの要素をポップすべく、ステップS42に移行する。
最上位のタイプがcomplexTypeでなく、「検証済み」でなく、それ以外である場合には(ステップS40;それ以外)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
ステップS42において、スキーマ検証部123は、スタックSの最上位の要素をポップする(ステップS42)。そして、スキーマ検証部123は、次の1バイトを読み取るべく、ステップS44を介してステップS32に移行する。
ステップS33において、コード種別が2,3バイトのコード種別であると判定した場合には(ステップS33;2,3バイトコード)、スキーマ検証部123は、以下の処理を行う(ステップS36)。スキーマ検証部123は、2バイトのコード種別ならば、1バイトを追加で読み取る。スキーマ検証部123は、3バイトのコード種別ならば、2バイトを追加で読み取る。
そして、スキーマ検証部123は、スタックSの最上位の要素のタイプが非complexType、かつ現符号コードのタイプと一致するか否かを判定する(ステップS37)。一致すると判定した場合には(ステップS37;Yes)、スキーマ検証部123は、スタックSの最上位の要素のタイプを「検証済み」のステータスに更新する(ステップS38)。そして、スキーマ検証部123は、次の1バイトを読み取るべく、ステップS44を介してステップS32に移行する。
一方、一致しないと判定した場合には(ステップS37;No)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
ステップS44の終了後、スキーマ検証部123は、スタックSが空であるか否かを判定する(ステップS43)。スタックSが空である、すなわちデータが無いと判定した場合には(ステップS43;Yes)、スキーマ検証部123は、XML定義ファイルが正常であると判断し、スキーマ検証処理を正常終了する。
一方、スタックSが空でない、すなわちデータが有ると判定した場合には(ステップS43;No)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
[開始タグ処理のフローチャート]
図12は、実施例に係る開始タグ処理のフローチャートの一例を示す図である。
図12に示すように、開始タグの符号コードを受け付けたスキーマ検証部123は、スタックSが空であるか否かを判定する(ステップS50)。なお、以降では、開始タグの符号コードを開始タグと略記する場合がある。スタックSが空であると判定した場合には(ステップS50;Yes)、スキーマ検証部123は、ステップS56に移行する。
一方、スタックSが空でないと判定した場合には(ステップS50;No)、スキーマ検証部123は、スタックSの最上位の要素のタイプを判定する(ステップS51)。スタックSの最上位の要素のタイプがcomplexTypeでないと判定した場合には(ステップS51;非complexType)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
スタックSの最上位の要素のタイプがcomplexTypeであると判定した場合には(ステップS51;complexType)、スキーマ検証部123は、以下の処理を行う。スキーマ検証部123は、転置インデックス132上を、自己の開始タグかスタックの最上位の要素が出現するまで走査する(ステップS52)。
スキーマ検証部123は、自己の開始タグが先に出現したか否かを判定する(ステップS53)。自己の開始タグが先に出現しないと判定した場合には(ステップS53;No)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
一方、自己の開始タグが先に出現したと判定した場合には(ステップS53;Yes)、スキーマ検証部123は、スタックSの最上位の要素のルールを用いて検証する(ステップS54A)。検証の結果、スキーマ検証部123は、検証がOKであるか否かを判定する(ステップS54B)。検証がOKでないと判定した場合には(ステップS54B;No)、スキーマ検証部123は、XML定義ファイルが異常であると判断し、スキーマ検証処理を異常終了する。
一方、検証がOKであると判定した場合には(ステップS54B;Yes)、スキーマ検証部123は、スタックSの最上位の要素に紐付いているルールを更新する(ステップS55)。そして、スキーマ検証部123は、ステップS56に移行する。
ステップS56において、スキーマ検証部123は、自己の開始タグに対応する終了タグをスタックSにプッシュする(ステップS56)。そして、スキーマ検証部123は、自己の開始タグのタイプを判定する(ステップS57)。自己の開始タグのタイプがcomplexTypeであると判定した場合には(ステップS57;complexType)、スキーマ検証部123は、以下の処理を行う。スキーマ検証部123は、自己の開始タグから終了タグまでのルール情報を転置インデックス132から抽出し、スタックSの最上位の要素に紐付ける(ステップS58)。そして、スキーマ検証部123は、開始タグ処理を終了する。
自己の開始タグのタイプがcomplexTypeでないと判定した場合には(ステップS57;非complexType)、スキーマ検証部123は、以下の処理を行う。スキーマ検証部123は、スタックSの最上位の要素に自己の開始タグのタイプを紐付ける(ステップS59)。そして、スキーマ検証部123は、開始タグ処理を終了する。
[実施例の効果]
このようにして、上記実施例では、情報処理装置100が、複数のタグそれぞれのタグ名または定義値と、符号とを対応づけた符号化辞書131を用いて、検証対象の複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイル133を生成する。情報処理装置100は、複数のXML定義ファイルに対応したXMLスキーマから、符号化辞書131を用いて、転置インデックス132を生成する。そして、情報処理装置100は、符号化XML定義ファイル133を、転置インデックス132を用いて検証する。かかる構成によれば、情報処理装置100は、検証対象の複数のXML定義ファイルごとに、スキーマを読み込み、検証することなく、高速に検証作業を行うことができる。
ここで、実施例に係るXMLスキーマ検証の効果の一例を、図13を参照して説明する。図13は、実施例に係るXMLスキーマ検証の効果の一例を示す図である。図13に示すように、複数のXML定義ファイルを圧縮する場合に、参考例の検証処理は、XMLスキーマ検証を行う際に、圧縮した圧縮ファイルを伸長する。そして、検証処理は、伸長した複数のXML定義ファイルごとにXMLスキーマを読み込み、読み込んだXMLスキーマを用いてそれぞれのXML定義ファイルの検証作業を行う。したがって、参考例の検証処理は、伸長処理に加えて、XML定義ファイルの数だけXMLスキーマを読み込み、それぞれのXML定義ファイルの検証作業を繰り返す必要があるため、高速に検証作業を行うことができない。
これに対して、複数のXML定義ファイルを圧縮する場合に、実施例の検証処理は、XMLスキーマ検証を行う際に、符号化した符号化XML定義ファイル133を、XMLスキーマ対応の符号化した転置インデックス132を用いて検証する。したがって、実施例の検証処理は、参考例の検証処理と比較して、IO負荷およびCPU負荷が低くなり、高速に検証作業を行うことができる。
また、上記実施例では、情報処理装置100は、XMLスキーマに含まれるタグのタグ名および定義値それぞれについて、符号化辞書131を用いて、タグ名および定義値それぞれのXMLスキーマ内の出現位置に関する転置インデックス132を生成する。かかる構成によれば、情報処理装置100は、XMLスキーマに含まれるタグのタグ名および定義値それぞれを符号化し、符号化したタグ名および定義値について、XMLスキーマ内の出現位置に関する転置インデックス132を生成する。この結果、情報処理装置100は、XML定義ファイルを符号化したまま、転置インデックス132を用いて検証作業を行うことができる。
また、上記実施例では、タグの定義値は、データ型および出現回数を含む。これにより、情報処理装置100は、タグの定義値をタグのルールとして転置インデックス132に設定することができ、転置インデックス132を用いてXML定義ファイルの検証作業を正確に行うことができる。
また、上記実施例では、情報処理装置100は、符号化XML定義ファイル133から検証対象として一纏まりの符号化データを抽出する。情報処理装置100は、転置インデックス132を用いて、抽出した符号化データの開始の符号に対応する第1の出現位置と、開始の符号から得られる終了の符号に対応する第2の出現位置とを抽出する。そして、情報処理装置100は、第1の出現位置と第2の出現位置との間の転置インデックス132のインデックスを用いて、検証対象として抽出された一纏まりの符号化データを検証する。かかる構成によれば、情報処理装置100は、1回だけ転置インデックス132を読み込むと、読み込んだ転置インデックス132を用いて複数の一纏まりの符号化データを検証することができ、高速に検証作業を行うことができる。
[その他]
なお、検証部120の符号化処理部122が、複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイル133を生成すると説明した。しかしながら、複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイル133を生成する処理は、検証部120で行わなくても良く、解析部110で行っても良い。また、複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイル133を生成する処理は、別の機能部で行っても良い。すなわち、複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイル133を生成する処理は、検証する際に行われても良いし、検証する前に予め行われていても良い。
また、図示した装置の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、装置の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、スキーマ検証部123は、コード種別が1バイトコードである場合の検証部と、コード種別が2,3バイトコードである場合の検証部と、コード種別が空である場合の検証部とを分散しても良い。また、スキーマ検証部123は、スキーマ検証処理と、開始タグ処理とを分散しても良い。また、解析部110は、字句解析部111と符号化処理部112とを統合しても良い。また、検証部120は、字句解析部121と符号化処理部122とを統合しても良い。また、記憶部130を情報処理装置100の外部装置としてネットワーク経由で接続するようにしても良い。
[情報処理装置のハードウェア構成]
下記に、上述の実施形態に用いられるハードウェア及びソフトウェアについて説明する。図14は、コンピュータのハードウェア構成例を示す図である。コンピュータ1は、例えば、プロセッサ301、RAM(Random Access Memory)302、ROM(Read Only Memory)303、ドライブ装置304、記憶媒体305、入力インターフェース(I/F)306、入力デバイス307、出力インターフェース(I/F)308、出力デバイス309、通信インターフェース(I/F)310、SAN(Storage Area Network)インターフェース(I/F)311およびバス312などを含む。それぞれのハードウェアはバス312を介して接続されている。
RAM302は読み書き可能なメモリ装置であって、例えば、SRAM(Static RAM)やDRAM(Dynamic RAM)などの半導体メモリ、またはRAMでなくてもフラッシュメモリなどが用いられる。ROM303は、PROM(Programmable ROM)なども含む。ドライブ装置304は、記憶媒体305に記録された情報の読み出しか書き込みかの少なくともいずれか一方を行なう装置である。記憶媒体305は、ドライブ装置304によって書き込まれた情報を記憶する。記憶媒体305は、例えば、ハードディスク、SSD(Solid State Drive)などのフラッシュメモリ、CD(Compact Disc)、DVD(Digital Versatile Disc)、ブルーレイディスクなどの記憶媒体である。また、例えば、コンピュータ1は、複数種類の記憶媒体それぞれについて、ドライブ装置304及び記憶媒体305を設ける。
入力インターフェース306は、入力デバイス307と接続されており、入力デバイス307から受信した入力信号をプロセッサ301に伝達する回路である。出力インターフェース308は、出力デバイス309と接続されており、出力デバイス309に、プロセッサ301の指示に応じた出力を実行させる回路である。通信インターフェース310はネットワーク3を介した通信の制御を行なう回路である。通信インターフェース310は、例えばネットワークインターフェースカード(NIC)などである。SANインターフェース311は、ストレージエリアネットワークによりコンピュータ1と接続された記憶装置との通信の制御を行なう回路である。SANインターフェース311は、例えばホストバスアダプタ(HBA)などである。
入力デバイス307は、操作に応じて入力信号を送信する装置である。入力信号は、例えば、キーボードやコンピュータ1の本体に取り付けられたボタンなどのキー装置や、マウスやタッチパネルなどのポインティングデバイスである。出力デバイス309は、コンピュータ1の制御に応じて情報を出力する装置である。出力デバイス309は、例えば、ディスプレイなどの画像出力装置(表示デバイス)や、スピーカーなどの音声出力装置などである。また、例えば、タッチスクリーンなどの入出力装置が、入力デバイス307及び出力デバイス309として用いられる。また、入力デバイス307及び出力デバイス309は、コンピュータ1と一体になっていても良いし、コンピュータ1に含まれず、例えば、コンピュータ1に外部から接続する装置であっても良い。
例えば、プロセッサ301は、ROM303や記憶媒体305に記憶されたプログラムをRAM302に読み出し、読み出されたプログラムの手順に従って解析部110および検証部120の処理を行なう。その際にRAM302はプロセッサ301のワークエリアとして用いられる。記憶部130の機能は、ROM303および記憶媒体305がプログラムファイル(後述のアプリケーションプログラム24、ミドルウェア23およびOS22など)やデータファイル(例えば、符号化辞書131、転置インデックス132、符号化XML定義ファイル133など)を記憶し、RAM302がプロセッサ301のワークエリアとして用いられることによって実現される。プロセッサ301が読み出すプログラムについては、図15を用いて説明する。
図15は、コンピュータで動作するプログラムの構成例を示す図である。コンピュータ1において、図14に示すハードウェア群(HW)21(301〜312)の制御を行なうOS(オペレーティング・システム)22が動作する。OS22に従った手順でプロセッサ301が動作して、ハードウェア群(HW)21の制御・管理が行なわれることにより、アプリケーションプログラム(AP)24やミドルウェア(MW)23に従った処理がハードウェア群21で実行される。さらに、コンピュータ1において、ミドルウェア(MW)23またはアプリケーションプログラム(AP)24が、RAM302に読み出されてプロセッサ301により実行される。
プロセッサ301が、解析機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)解析部110の機能が実現される。プロセッサ301が、検証機能が呼び出された場合に、ミドルウェア23またはアプリケーションプログラム24の少なくとも一部に基づく処理を行なうことにより、(それらの処理をOS22に基づいてハードウェア群21を制御して)検証部120の機能が実現される。解析機能および検証機能は、アプリケーションプログラム24自体に含まれても良いし、アプリケーションプログラム24に従って呼び出されることで実行されるミドルウェア23の一部であっても良い。
図16は、実施形態のシステムにおける装置の構成例を示す図である。図16のシステムは、コンピュータ1a、コンピュータ1b、基地局2およびネットワーク3を含む。コンピュータ1aは、無線または有線の少なくとも一方により、コンピュータ1bと接続されたネットワーク3に接続している。
図3に示す解析部110と検証部120とは、図16に示すコンピュータ1aとコンピュータ1bとのいずれに含まれても良い。コンピュータ1bが解析部110の機能を含み、コンピュータ1aが検証部120の機能を含んでも良いし、コンピュータ1aが解析部110の機能を含み、コンピュータ1bが検証部120の機能を含んでも良い。また、コンピュータ1aとコンピュータ1bとの双方が、解析部110の機能および検証部120の機能を備えても良い。
100 情報処理装置
110 解析部
111 字句解析部
112 符号化処理部
113 インデックス生成部
120 検証部
121 字句解析部
122 符号化処理部
123 スキーマ検証部
130 記憶部
131 符号化辞書
132 転置インデックス
133 符号化XML定義ファイル

Claims (6)

  1. コンピュータに、
    複数のタグそれぞれのタグ名または定義値と、符号とを対応づけた符号化辞書を用いて、検証対象の複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイルを生成し、
    前記複数のXML定義ファイルに対応したスキーマから、前記符号化辞書を用いて、スキーマ対応インデックスを生成し、
    前記符号化XML定義ファイルを、前記スキーマ対応インデックスを用いて検証する
    処理を実行させる検証プログラム。
  2. 前記スキーマ対応インデックスを生成する処理は、前記スキーマに含まれるタグのタグ名および定義値それぞれについて、前記符号化辞書を用いて、前記タグ名および定義値それぞれの前記スキーマ内の出現位置に関するスキーマ対応インデックスを生成する
    処理を実行させる請求項1に記載の検証プログラム。
  3. 前記タグの定義値は、データ型および出現回数を含む
    ことを特徴とする請求項1または請求項2に記載の検証プログラム。
  4. 前記検証する処理は、
    前記符号化XML定義ファイルから検証対象として一纏まりの符号化データを抽出し、
    前記スキーマ対応インデックスを用いて、抽出した符号化データの開始の符号に対応する第1の出現位置と、前記開始の符号から得られる終了の符号に対応する第2の出現位置とを抽出し、
    前記第1の出現位置と前記第2の出現位置との間の前記スキーマ対応インデックスのインデックスを用いて、前記検証対象として抽出された前記一纏まりの符号化データを検証する
    ことを特徴とする請求項1に記載の検証プログラム。
  5. 複数のタグそれぞれのタグ名または定義値と、符号とを対応づけた符号化辞書を用いて、検証対象の複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイルを生成する第1の生成部と、
    前記複数のXML定義ファイルに対応したスキーマから、前記符号化辞書を用いて、スキーマ対応インデックスを生成する第2の生成部と、
    前記符号化XML定義ファイルを、前記スキーマ対応インデックスを用いて検証する検証部と、
    を有する検証装置。
  6. コンピュータが、
    複数のタグそれぞれのタグ名または定義値と、符号とを対応づけた符号化辞書を用いて、検証対象の複数のXML定義ファイルそれぞれを符号化した符号化XML定義ファイルを生成し、
    前記複数のXML定義ファイルに対応したスキーマから、前記符号化辞書を用いて、スキーマ対応インデックスを生成し、
    前記符号化XML定義ファイルを、前記スキーマ対応インデックスを用いて検証する
    処理を実行する検証方法。
JP2018003561A 2018-01-12 2018-01-12 検証プログラム、検証装置および検証方法 Pending JP2019125035A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2018003561A JP2019125035A (ja) 2018-01-12 2018-01-12 検証プログラム、検証装置および検証方法
US16/216,153 US20190220502A1 (en) 2018-01-12 2018-12-11 Validation device, validation method, and computer-readable recording medium

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2018003561A JP2019125035A (ja) 2018-01-12 2018-01-12 検証プログラム、検証装置および検証方法

Publications (1)

Publication Number Publication Date
JP2019125035A true JP2019125035A (ja) 2019-07-25

Family

ID=67214011

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2018003561A Pending JP2019125035A (ja) 2018-01-12 2018-01-12 検証プログラム、検証装置および検証方法

Country Status (2)

Country Link
US (1) US20190220502A1 (ja)
JP (1) JP2019125035A (ja)

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3815567B2 (ja) * 2003-03-31 2006-08-30 日本電気株式会社 コンピュータシステム、コンピュータプログラム、コンピュータ間の通信方法、構造化文書の符号化方法、符号化された構造化文書の復号方法
JP2005167709A (ja) * 2003-12-03 2005-06-23 Canon Inc 記録装置、記録再生装置、通信装置、通信システム、記録方法、通信方法、コンピュータプログラム、及びコンピュータ読み取り可能な記録媒体
US7437374B2 (en) * 2004-02-10 2008-10-14 International Business Machines Corporation Efficient XML schema validation of XML fragments using annotated automaton encoding
US20060085451A1 (en) * 2004-10-15 2006-04-20 Microsoft Corporation Mapping of schema data into data structures

Also Published As

Publication number Publication date
US20190220502A1 (en) 2019-07-18

Similar Documents

Publication Publication Date Title
CN110968322B (zh) Json数据的处理方法、装置和电子系统
US7464367B2 (en) Method and system for designing customizable applications and user-interfaces based on user-defined policies and metadata
JP4997777B2 (ja) デリミタを減少させる方法及びシステム
JP5377818B2 (ja) コンパイル済みスキーマに順次アクセスする方法とシステム
US20050172217A1 (en) System and method for schemaless data mapping with nested tables
JP5044942B2 (ja) 文書分析において受付状態を決定するシステム及び方法
JP3986098B2 (ja) 文字列検索方法及び文字列検索装置
US7530017B2 (en) Document transformation system
JP5044943B2 (ja) データ文書の高速符号化方法及びシステム
JP5789236B2 (ja) 構造化文書分析方法、構造化文書分析プログラム、および構造化文書分析システム
JP4776389B2 (ja) 符号化文書復号方法及びシステム
JP6648431B2 (ja) 照合プログラム、照合方法および照合装置
EP3236368A1 (en) Encoding processing program, encoding processing device, encoding processing method, decoding processing program, decoding processing device, and decoding processing method
JP2019125035A (ja) 検証プログラム、検証装置および検証方法
JP6805720B2 (ja) データ検索プログラム、データ検索装置およびデータ検索方法
JP2017028374A (ja) 符号化プログラム、符号化装置、符号化方法、照合プログラム、照合装置および照合方法
US20220035791A1 (en) Verification method, information processing apparatus, and non-transitory computer-readable storage medium for storing verification program
JP5906906B2 (ja) ログ管理方法、ログ管理システムおよび情報処理装置
JP2006221655A (ja) スキーマをコンパイルする方法とシステム
WO2018096686A1 (ja) 検証プログラム、検証装置、検証方法、インデックス生成プログラム、インデックス生成装置およびインデックス生成方法
CN113656474A (zh) 业务数据的接入方法、装置、电子设备及存储介质
US20020165865A1 (en) Data operating device for providing schema with freedom in data operation of object-oriented database
JP2019185145A (ja) データ生成プログラム、データ生成方法および情報処理装置
CN113407508B (zh) 一种日志文件压缩的方法、系统、设备及介质
WO2022230809A1 (ja) シリアル化方法、逆シリアル化方法、情報処理プログラム、情報処理装置及び通信システム