←
▼
▲
XmlReadOrError
Function XmlReadOrError( in_BaseXmlElement as IXMLDOMElement, in_XPath as string,
in_FilePath as string ) as string
XML にデータが記述されていなければエラーになる
です。
in_FilePath
Empty または エラーメッセージに表示する XML ファイルの名前
【引数】
in_BaseXmlElement
in_XPath
in_XPath の基準となる XML要素(タグ)
タグの間のテキスト、または XML の属性の位置を表す in_XPath
返り値
テキストまたは XML 属性の値。文字列型
エラーメッセージは、下記のようになります。
テスト
ソース
関連
<ERROR msg="見つかりません" file="Setting.xml" name="/Root/Tag1/@attr1"/>
Set root = LoadXML( "Setting.xml", Empty ) '// as IXMLDOMElement
value = XmlReadOrError( root, "./Tag1/@attr1", "Setting.xml" )
サンプル
→ T_XML.vbs # [T_XmlRead]
Tag1/@attr1
XmlReadOrError
in_FilePath = Empty のときのエラーメッセージは、下記のようになります。
<ERROR msg="見つかりません" name="/Root/Tag1/@attr1"/>
→ vbslib.vbs
←
▼
▲
Function Read_XML_Encoding( in_Path as string ) as string
XML ファイルから、?xml タグの encoding 属性を読みます。
【引数】
in_Path
XML ファイルのパス
→ T_XML.vbs
テスト
ソース
→ vbslib.vbs
T_LoadXML
関連
encoding 属性の値、文字コード セット名
返り値
?xml タグ(XML宣言)の encoding 属性が設定されてなく、UTF-16 の BOM があるときは、
"UTF-16" が返ります。 encoding 属性が設定されてなく、BOM がないときは、"UTF-8"
が返ります。 encoding 属性が設定されてないときに "UTF-8" であるのは、HTML5 の
仕様です。
←
▼
▲
Function XmlRead( in_BaseXmlElement as IXMLDOMElement, in_XPath as string,
in_DefaultValue as boolean, in_FilePath as string or Empty ) as string
XML のタグの間のテキスト、または XML の属性の値を、論理型で取得します。
【引数】
in_BaseXmlElement
in_XPath
in_XPath の基準となる XML要素(タグ)
タグの間のテキスト、または XML の属性の位置を表す in_XPath
返り値
タグの間の値、または XML 属性の値。 論理型
in_DefaultValue
in_FilePath
in_Path が指す XML ノードがないときの返り値
エラーが発生したときに表示するファイルのパス、または Empty
タグの間のテキストは、厳密には in_XPath = "/Root/Elem/text()" ですが、in_XPath =
"/Root/Elem" を指定してください。
in_XPath が相対パスのときは、in_BaseXmlElement のタグが基準になります。
in_XPath にフル・パスを指定することもできます。
参考
サンプル
Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
value = XmlReadBoolean( root, "./Tag1/@attr1", False, "a.xml" )
XmlReadBoolean
テスト
→ T_XML.vbs # [T_XmlReadBoolean]
XML に記述する値は、Yes, No, True, False のいずれかです。 大文字小文字は区別しません。
XML の例:
<Root> <Tag1 attr1="yes"/> </Root>
ソース
→ vbslib.vbs
in_DefaultValue には、Empty など、オブジェクト型以外を指定できます。
←
▼
▲
テスト
→ T_XML.vbs # T_XmlSelect
Function XmlSelect( BaseXmlElement as IXMLDOMElement, XPath as string ) as IXMLDOMElement
XML のタグのオブジェクトを返します。 もし、該当する XML のタグが無ければ生成して返します。
【引数】
BaseXmlElement
XPath
XPathForXmlElement の基準となる XML要素(タグ)
XML 要素(タグ)の位置を表す XPath
返り値
XML 要素(タグ)のオブジェクト
ソース
→ vbslib.vbs
←
▼
▲
Function XmlAttrDic( XmlElem as IXMLDOMElement ) as dictionary of string
XML 要素(タグ)の属性を、辞書にします。
【引数】
XmlElem
XML 要素
キーが属性名、アイテムが属性値の辞書
返り値
→ T_XML.vbs # [T_XmlAttrDic]
テスト
ソース
→ vbslib.vbs
←
▼
▲
Dim base, x
Set base = GetHRefBase( "sample.xml", Array("X") )
Set x = base.href( "target.xml#name1" )
Assert x.getAttribute( "name" ) = "name1"
sample.xml
<Root>
<A href="target.xml#name1">Link</A>
</Root>
target.xml
<Root>
<X name="name1"/>
</Root>
Function GetHRefBase( BasePath as string, TargetTagNames as array of string ) as HRefBase
HTML の A href のようなリンクを取得するためのオブジェクトを返します。
【引数】
BasePath
基準となる XML ファイルのパス
TargetTagNames
リンク先となる id, name 属性を持つタグの名前の配列
リンクを取得するためのオブジェクト
返り値
サンプル
関連
"sample.xml"
"target.xml#name1"
"target.xml#name1"
循環参照検出あり
テスト
→ T_XML.vbs # [T_HRefBase]
(src)
"X"
←
▼
▲
Function HRefBase::href( URL as string ) as IXMLDOMElement
HTML の A href のようなリンクのリンク先となる XML タグを取得します。
【引数】
URL
リンク先のURL
リンク先の XML タグ
返り値
参考
他の XML ファイルへのリンクがあるときは、内部で自動的に LoadXML が呼ばれます。
(src)
HRefBase オブジェクトの取得
こともできます。
リンク先が見つからないときはエラーになります。
IXMLDOMElement
関連
→ getElementById (HTMLDocument)
←
▼
▲
データ構造
.SourceXmlPath as string
.SourceXmlRootElem as IXMLDOMElement
.TargetXmlPath as string
.TargetXmlRootElem as IXMLDOMElement
リンク元の XML ファイルのパス
SourceXmlPath のルート XML タグ
リンク先の XML ファイルのパス
TargetXmlPath のルート XML タグ
リンク先になれるタグ名の配列
HTML の A href のようなリンクの、リンク先となる XML タグを取得します。
リンク先の名前は、name 属性か id 属性に指定します。 両者に違いはありません。
他の XML ファイルへのリンクがあるときは、内部で自動的に LoadXML が呼ばれます。
リンク先のリンク先が、循環参照しているかどうかを検出することもできます。
Dim root, a, x, linker
Set root = LoadXML( "sample.xml", Empty )
Set a = root.selectSingleNode( "./A" ) '// A タグ
Set linker = new LinkedXMLs
linker.XmlTagNamesHavingIdName = Array( "X" )
linker.StartNavigation "sample.xml", root
Set x = linker.GetLinkTargetNode( "target.xml#name1" ) '// X タグ
linker.EndNavigation
sample.xml
スクリプト
<Root>
<A href="target.xml#name1">Link</A>
</Root>
target.xml
<Root>
<X name="name1"/>
</Root>
"sample.xml"
"X"
"target.xml#name1"
"sample.xml"
他の XML ファイルへのリンクがあるときは、内部で LoadXML が呼ばれ、返される XML
ルートタグは、内部にキャッシュされます。 最新の情報に更新するとき(キャッシュを
クリアするとき)は、LinkedXMLs オブジェクトを再生成してください。
(src)
テスト
関連
.TargetLocation as string
直前のリンク先のパス、# を含む場合もある
関連
→ XPath - [@name='value'] (属性の値でフィルターする述語)
←
▼
▲
getLinkTargetNode メソッドでリンク先にできる XML のid 属性や name 属性を持つ XML タグ名の配列。
Set linker = new LinkedXMLs
linker.XmlTagNamesHavingIdName = Array( "TestCases", "TestCase", "SubCase" )
サンプル
<A href="#name1">1</A> <A href="#name2">2</A> <A href="#name3">3</A>
<TestCases id="name1"/> <TestCase name="name2"/> <Others id="name3"/>
XmlTagNamesHavingIdName に指定した名前を持つタグにリンクすることができます。
下記の A href のうち、name1, name2 はリンク先が見つかりますが、name3 は見つかりません。
Dim LinkedXMLs::XmlTagNamesHavingIdName as string
"TestCases", "TestCase", "SubCase"
←
▼
▲
Sub LinkedXMLs::StartNavigation( SourceLocation as string, SourceXmlRootElem as IXMLDOMElement )
(src)
現在の XML ファイル(リンク元)の情報を指定します。
【引数】
SourceLocation
SourceXmlRootElem
現在の XML ファイルのパス。相対パスでも可能。 # があれば付けること
SourceXmlPath のファイルのルート XML タグ (下記)
SourceXmlRootElem 引数
初めてリンク先を探すときは、LoadXML の返り値を指定します。
リンク先の更にリンク先を探すときは、LinkedXMLs::TargetXmlRootElem を指定します。
←
▼
▲
(src)
Sub LinkedXMLs::EndNavigation()
で指定した現在の XML ファイルの終了を指定します。
←
▼
▲
(src)
Function LinkedXMLs::GetLinkTargetNode( TargetLocation as string ) as IXMLDOMElement
リンク先となる XML タグを取得します。
【引数】
TargetLocation
返り値
リンク先のパス。 target.xml#name 形式
リンク先のタグ
本関数が成功すると、Me.TargetXmlPath(リンク先の XML ファイルのパス)と、
Me.TargetXmlRootElem (TargetXmlPath のルート XML タグ)も更新されます。
StartNavigation をネストしていくと、GetLinkTargetNode で、循環参照エラーを検出できます。
linker.StartNavigation "sample.xml", root
Set a = linker.GetLinkTargetNode( "#a" )
linker.StartNavigation linker.TargetLocation, linker.TargetXmlRootElem
Set b = linker.GetLinkTargetNode( "#b" )
linker.StartNavigation linker.TargetLocation, linker.TargetXmlRootElem
Set a2 = linker.GetLinkTargetNode( "#a" ) '// 循環参照エラー
linker.EndNavigation
linker.EndNavigation
linker.EndNavigation
linker.StartNavigation "sample.xml", root
Set b = linker.GetLinkTargetNode( "#b" ) '// 循環参照エラーにならない
linker.EndNavigation
循環参照エラーの検出
linker.StartNavigation "sample.xml", root
Set x = linker.GetLinkTargetNode( "target.xml#name1" )
linker.EndNavigation
サンプル
"target.xml#name1"
参考
IXMLDOMElement
←
▼
▲
テスト
→ T_XML.vbs
ソース
→ vbslib.vbs
Function ParseAttributesInXML( in_AttributesString as string,
in_AttributeNames as array of string ) as dictionary of string
文字列の中にある XML のタグの属性の部分を解析します。
【引数】
in_AttributesString
XML のタグの属性の部分。 文字列型
XML 属性の名前をキーとした、属性値の辞書
返り値
サンプル
Set attrs = ParseAttributesInXML( "a=""Apple"" b=""Banana""", Array( "a", "b" ) )
Assert attrs( "a" ) = "Apple"
Assert attrs( "b" ) = "Banana"
サンプル
Set attrs = ParseAttributesInXML( "Text1 a=""Apple"" c=""Cherry""", Array( "a", "b", "" ) )
Assert attrs( "a" ) = "Apple"
Assert not attrs.Exists( "b" )
Assert not attrs.Exists( "c" )
Assert attrs( "" ) = "Text1 c=""Cherry"""
in_AttributeNames
解析する XML 属性の名前の配列
補足
" " で囲まれた属性値に " を含めるときは、" に置き換えてください。
' ' で囲まれた属性値に ' を含めるときは、' に置き換えてください。
属性値は " " で囲んでも ' ' で囲んでも上記以外の違いはありません。
ただし、" " または ' ' で囲む必要があります。
= の隣には空白があってもなくても構いません。
→ XML - 実体参照、文字参照
参考
実体参照や文字参照(例:&)
属性値以外のテキストに、解析対象の属性を設定するような形式(名="値")を設定するとき
(例: 属性 a を解析するときに attrs( "" ) に "a=""A""" を残すとき)は、
= を = に置き換えてください。 例: "a=""A"""。
属性値に
を含めることができます。 しかし、設定値には、<, >, &
本関数の in_AttributesString 引数に指定できる「vbslib の XML 属性」 の文字列は、XML の文法と
しては認められていないもの(例: <, >, & が含まれている文字列)でも、ほぼ問題なく解析できます。
同じ属性名の属性が in_AttributesString 引数に複数あったときは、それぞれの属性値の間に
改行 vbCRLF が入る形でまとめられます。 XML の文法では同じ属性名の属性は、認められて
いません。
"a=""Apple"" b=""Banana"""
"Text1 a=""Apple"" c=""Cherry"""
"Text1 c=""Cherry"""
をそのまま記述できます。 XML の文法としては認められていませんが、実体参照に変換して記述
する必要はありません。 ただし、属性値に実体参照や文字参照(例:&)と同じ形式(& から
始まり、英数字があり、; で終わる形式)の文字列を設定したいときだけは、
& を & に置き換えてください。
"If ( c < d && e > f ) { a = ""Apple < > &"" }"
a="Apple < > &"
入力:
出力:
出力:
入力:
a= " < > " ""
"a=' < > " &quot;'"
&quot;
"
a= "1"+ vbCRLF +"2"
入力:
出力:
"a=""1"" a=""2"""
"a=""A"""
出力:
attrs("")= "a=""A"""
入力:
T_ParseAttributesInXML
XML タグの属性の形式は、名="値" または 名='値' です。
文字列に = 文字を含む場合、XML タグの属性の可能性がありますが、= の左が解析対象の属性名
ではないときや、= の右が " または ' ではないときは、一般の文字列として扱われます。 XML の文法
としては認められていませんが、エラーにはなりません。 また、
in_AttributeNames 引数に指定した配列に空の文字列 "" が含まれるときは、XML タグの属性を
削除した残りの文字列を出力することができます。
XML 属性が削除した部分の空白の文字数は、XML 属性の両隣にある空白の文字数の小さいほう
になります。 ただし、前(左)の XML 属性が抜かれたときに右隣の空白が少なくなったら、次(右)の
XML 属性の左隣の空白はその少なくなった文字数が使われます。
実体参照や文字参照(例:&)
で記述すれば、XML タグの属性の形式と同じ形式の値も出力することができます(エスケープ)。
←
▼
▲
Function DecodeCharacterReferencesOfXML( in_String as string ) as string
をデコードします。
【引数】
in_String
返り値
実体参照や文字参照を含む文字列
実体参照や文字参照を対応する文字に変換した文字列
テスト
→ T_XML.vbs
ソース
→ vbslib.vbs
XML の実体参照や文字参照(例:&)
本関数の in_String 引数に指定できる「vbslib の XML 属性」 の文字列は、XML の文法と
しては認められていないもの(例: <, >, & が含まれている文字列)でも、ほぼ問題なく
解析できます。
参考
a_string = DecodeCharacterReferencesOfXML( "& < > " & < >" )
Assert a_string = "& < > "" & < >"
サンプル
T_ParseAttributesInXML
"& < > " & < >"
"& < > "" & < >"
←
▼
▲
text_template = _
vbCRLF +_
vbTab + vbTab +"Line1"+ vbCRLF +_
vbTab + vbTab + vbTab +"Line2"+ vbCRLF +_
vbTab + "Line3"+ vbCRLF +_
vbTab + vbTab
output = CutIndentOfMultiLineText( text )
Assert output = _
vbTab +"Line1"+ vbCRLF +_
vbTab + vbTab +"Line2"+ vbCRLF +_
"Line3"+ vbCRLF
Function CutIndentOfMultiLineText( in_Text as string, in_Indent as string or Empty,
in_NewLine as string, in_Option as boolean or Empty ) as string
インデントをカットします。 また、XML で改行コードが混在したテキストを扱います。
【引数】
in_Text
インデントをカットする前の文字列。改行コードは、LF
in_Indent
Empty か、代わりに追加する文字数*インデントの文字、例:"1*"+ vbTab
関連
サンプル
→ T_XML.vbs
テスト
T_XmlText
→ vbslib.vbs
ソース
すべての行がインデントしてから(タブ文字や空白文字から)始まる場合、そのインデントを
カットします。 XML パーサーは、
先頭行が空行のときは、その先頭行をカットします(XML パーサーは、HTML パーサーと
異なり、先頭の空行をカットしません)。
最終行がインデントしかなく、末尾に改行文字がないときは、その最終行をカットします(XML
パーサーは、HTML パーサーと異なり、末尾の空行はカットしません)。
参考
XML パーサーは、改行コードを LF に統一してしまいます。 そのため、本関数では、改行コードが
混在したテキストも読み込む(アプリケーションが扱う)ことができるように、in_Text 引数(XML
テキスト)の行末に改行コードを指定します。
・行末の "\r"+ LF は CR の改行
・行末の "\n"+ LF は LF の改行
・行末の "\r\n"+ LF は CR+LF の改行
・行末の その他の文字+ LF は、in_NewLine 引数に指定した改行
なお、この拡張(行末の改行コード指定)は、標準的な XML との互換性を考慮して、特定の XML
属性に指定するオプション(例: cut_indent="yes")があるときだけ有効にするようなアプリケー
ションにすべきです。 CutIndentOfMultiLineText 関数の in_Option 引数に
g_VBS_Lib.KeepLineSeparators を指定したときも、行末の その他の文字+ LF は、LF の改行に
なります。
→ XML の改行文字の正規化による副作用
<Text cut_indent="yes">
Line1
Line2
Line3
</Text>
^ Line1(改行)
^ ^ Line2(改行)
Line3(改行)
XML ファイル:
CutIndentOfMultiLineText の返り値:
スクリプト:
XML パーサーの出力:
(改行)
^ ^ Line1(改行)
^ ^ ^ Line2(改行)
^ Line3(改行)
^
参考
cut_indent="yes" は、(対応アプリケーション
では)、インデントをカットすることを示しています。
アプリケーションの内部では、このオプションがある
ときだけ、CutIndentOfMultiLineText を呼び出します。
<Text cut_indent="yes">
Line1
Line2\n
Line3\r
Line4\r\n
</Text>
^ Line1(CR+LF)
^ ^ Line2(LF)
Line3(CR)
Line4(CR+LF)
XML ファイル:
CutIndentOfMultiLineText の返り値:
XML パーサーの出力:
(LF)
^ ^ Line1(LF)
^ ^ ^ Line2\n(LF)
^ Line3\r(LF)
^ Line4\r\n(LF)
^
サンプル
^ は、タブ文字
^ は、タブ文字
cut_indent="yes" は、(対応アプリケーション
では)、改行文字の種類によって区別します。
アプリケーションの内部では、このオプションがある
ときだけ、CutIndentOfMultiLineText を呼び出します。
本関数を呼び出すアプリケーションが入出力する XML ファイルは、複数行のテキスト(タグの間)
が記述しやすくなります。 ただし、cut_indent="yes" 属性(名前はアプリケーションの仕様による)
を付ける必要があります。
<Text cut_indent="yes">
Line1
Line2
</Text>
Line1
Line2
Line1
Line2
XML ファイル:
CutIndentOfMultiLineText
の返り値:
XML パーサーの出力:
g_VBS_Lib.KeepLineSeparators
Empty または、下記の定数の論理和 (or) を指定できます。
g_VBS_Lib.CutLineSeparators
末尾が改行文字ならその改行を1つカットして返します。
カットした後の文字列
返り値
Empty または 下記
in_Option
If set_item.getAttribute( "cut_indent" ) = "yes" Then
text = CutIndentOfMultiLineText( text, set_item.getAttribute( "indent" ), _
Empty, g_VBS_Lib.CutLastLineSeparator )
End If
スクリプト:
サンプル
XML ファイル:
<Text cut_indent="yes" indent="1*	">
Line1
Line2
</Text>
^ Line1
^ Line2
CutIndentOfMultiLineText
の返り値:
^ は、タブ文字
in_NewLine
返り値の改行コード、Empty(CR+LF), vbCRLF, vbLF, "CR+LF", "LF"
cut_indent
cut_indent
indent
cut_indent
indent
または
<Text cut_indent="yes"><![CDATA[
Line1
Line2
]]></Text>
→ CDATA セクション
←
▼
▲
関連
<?xml version="1.0" encoding="UTF-8"?><MultiText><Text id="1"><![CDATA[
abc def
]]></Text><Text id="second"><![CDATA[
------------------------------------------------------------
abc
def
------------------------------------------------------------
]]></Text></MultiText>
abc def
abc
def
ファイルのパス(アドレス)に "Sample.xml#1" を指定すると、下記の文字列が取得できます。
最後に改行が入りますが、アプリケーションによっては最後の改行を1つ削除します。
Sample.xml
ファイルのパス(アドレス)に "Sample.xml#second" を指定すると、下記の文字列が取得できます。
最後に改行が入りますが、アプリケーションによっては最後の改行を1つ削除します。
タグ名は、上記と異なるタグ名でも構いませんが、id 属性は必須です。
encoding 属性の設定値は、ファイルの文字コードの設定に合わせてください。
例: UTF-8、UTF-16、Shift_JIS など
複数のテキスト・ファイルを1つにまとめた XML ファイル。
先頭文字 (<![CDATA[ の直後) が改行文字の時は、その改行文字は取得されません。
改行文字から始めるときは、2つの改行文字をファイルに記述してください。
最初の行や最後の行が ---- のように - が4つ以上あるだけの行のときは、その行は取得され
ません。 コメントとして無視されます。 ---- から始まるテキストは、2行目から記述してください。
ファイルに同じ id 属性が存在すると、上の方にある部分のみ有効になります。
ファイルのパス(アドレス)に "Sample.xml" を指定すると、ファイルの全体の内容が取得できます。
→ MultiTextXML_Class (clib)
ファイルの内容を内部でキャッシュします。
参考
→ XML
----
マルチ パート テキストXML の id 属性を、グループ名+メンバー名として階層化して、すべての
グループに関してループするコードは、以下のようになります。 なお、a_tail には、代表とする
メンバー名を設定してください。
Set test_data = new MultiTextXML_Class
'// Set "test_symbols"
a_tail = "_TestText"
Set test_symbols = new ArrayClass
Set root = LoadXML( test_path, Empty )
For Each elem In root.selectNodes( "./Text" )
id = elem.getAttribute( "id" )
If Right( id, Len( a_tail ) ) = a_tail Then
test_symbols.Add Left( id, Len( id ) - Len( a_tail ) )
End If
Next
'// ...
For Each test_symbol In test_symbols.Items
text = test_data.GetText( test_path +"#"+ test_symbol +"_TestText" )
ans = test_data.GetText( test_path +"#"+ test_symbol +"_Answer" )
Next
を内部で呼び出しており、id 属性と供に cut_indent 属性が
あれば、indent 属性や改行コードも指定することができます。
LF\n
CR+LF