(for Internet Explorer)
← ▼ ▲
↑
XmlReadOrError
Function XmlReadOrError( in_BaseXmlElement as IXMLDOMElement, in_XPath as string,
in_FilePath as string ) as string
XML にデータが記述されていなければエラーになる
です。
XmlRead
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]
→ XmlRead
Tag1/@attr1
XmlReadOrError
in_FilePath = Empty のときのエラーメッセージは、下記のようになります。
<ERROR msg="見つかりません" name="/Root/Tag1/@attr1"/>
→ vbslib.vbs
← ▼ ▲
Read_XML_Encoding
Function Read_XML_Encoding( in_Path as string ) as string
XML ファイルから、?xml タグの encoding 属性を読みます。
【引数】
in_Path
XML ファイルのパス
→ T_XML.vbs
テスト
ソース
→ vbslib.vbs
T_LoadXML
関連
→ ReadUnicodeFileBOM
encoding 属性の値、文字コード セット名
返り値
?xml タグ（XML宣言）の encoding 属性が設定されてなく、UTF-16 の BOM があるときは、
"UTF-16" が返ります。 encoding 属性が設定されてなく、BOM がないときは、"UTF-8"
が返ります。 encoding 属性が設定されてないときに "UTF-8" であるのは、HTML5 の
仕様です。
← ▼ ▲
XmlReadBoolean
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
→ XmlRead
テスト
→ T_XML.vbs # [T_XmlReadBoolean]
XML に記述する値は、Yes, No, True, False のいずれかです。 大文字小文字は区別しません。
XML の例：
<Root> <Tag1 attr1="yes"/> </Root>
ソース
→ vbslib.vbs
in_DefaultValue には、Empty など、オブジェクト型以外を指定できます。
← ▼ ▲
XmlSelect
テスト
→ 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
← ▼ ▲
XmlAttrDic
Function XmlAttrDic( XmlElem as IXMLDOMElement ) as dictionary of string
XML 要素（タグ）の属性を、辞書にします。
【引数】
XmlElem
XML 要素
キーが属性名、アイテムが属性値の辞書
返り値
→ T_XML.vbs # [T_XmlAttrDic]
テスト
ソース
→ vbslib.vbs
← ▼ ▲
GetHRefBase
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 属性を持つタグの名前の配列
リンクを取得するためのオブジェクト
返り値
サンプル
href
関連
→ href (HRefBase)
"sample.xml"
"target.xml#name1"
"target.xml#name1"
→ LinkedXMLs クラス
循環参照検出あり
テスト
→ T_XML.vbs # [T_HRefBase]
(src)
"X"
→ GetTagJumpParams
← ▼ ▲
href (HRefBase)
Function HRefBase::href( URL as string ) as IXMLDOMElement
HTML の A href のようなリンクのリンク先となる XML タグを取得します。
【引数】
URL
リンク先のURL
リンク先の XML タグ
返り値
参考
→ GetHRefBase
他の XML ファイルへのリンクがあるときは、内部で自動的に LoadXML が呼ばれます。
(src)
HRefBase オブジェクトの取得
→ GetLinkTargetNode (LinkedXMLs)
パスにピリオドを３つ並べる
こともできます。
リンク先が見つからないときはエラーになります。
IXMLDOMElement
関連
→ getElementById (HTMLDocument)
<< GetHRefBase
← ▼ ▲
LinkedXMLs クラス
データ構造
.XmlTagNamesHavingIdName as array of string
.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)
GetLinkTargetNode
EndNavigation
StartNavigation
XmlTagNamesHavingIdName
テスト
→ GetHRefBase
→ GetHRefBase
関連
.TargetLocation as string
直前のリンク先のパス、# を含む場合もある
→ GetTagJumpParams
関連
→ XPath - [@name='value'] （属性の値でフィルターする述語）
← ▼ ▲
XmlTagNamesHavingIdName (LinkedXMLs)
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"
← ▼ ▲
StartNavigation (LinkedXMLs)
Sub LinkedXMLs::StartNavigation( SourceLocation as string, SourceXmlRootElem as IXMLDOMElement )
(src)
現在の XML ファイル（リンク元）の情報を指定します。
【引数】
SourceLocation
SourceXmlRootElem
現在の XML ファイルのパス。相対パスでも可能。 # があれば付けること
SourceXmlPath のファイルのルート XML タグ (下記)
SourceXmlRootElem 引数
初めてリンク先を探すときは、LoadXML の返り値を指定します。
リンク先の更にリンク先を探すときは、LinkedXMLs::TargetXmlRootElem を指定します。
← ▼ ▲
EndNavigation (LinkedXMLs)
(src)
Sub LinkedXMLs::EndNavigation()
StartNavigation
で指定した現在の XML ファイルの終了を指定します。
← ▼ ▲
GetLinkTargetNode (LinkedXMLs)
(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"
参考
→ href (HRefBase)
IXMLDOMElement
← ▼ ▲
ParseAttributesInXML
テスト
→ 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 属性の名前の配列
補足
" " で囲まれた属性値に " を含めるときは、&quot; に置き換えてください。
' ' で囲まれた属性値に ' を含めるときは、&apos; に置き換えてください。
属性値は " " で囲んでも ' ' で囲んでも上記以外の違いはありません。
ただし、" " または ' ' で囲む必要があります。
= の隣には空白があってもなくても構いません。
→ XML - 実体参照、文字参照
参考
実体参照や文字参照（例：&amp）
属性値以外のテキストに、解析対象の属性を設定するような形式（名="値"）を設定するとき
（例： 属性 a を解析するときに attrs( "" ) に "a=""A""" を残すとき）は、
= を &#x3D; に置き換えてください。 例： "a&#x3D;""A"""。
属性値に
を含めることができます。 しかし、設定値には、<, >, &
本関数の in_AttributesString 引数に指定できる「vbslib の XML 属性」 の文字列は、XML の文法と
しては認められていないもの（例： <, >, & が含まれている文字列）でも、ほぼ問題なく解析できます。
同じ属性名の属性が in_AttributesString 引数に複数あったときは、それぞれの属性値の間に
改行 vbCRLF が入る形でまとめられます。 XML の文法では同じ属性名の属性は、認められて
いません。
"a=""Apple"" b=""Banana"""
"Text1 a=""Apple"" c=""Cherry"""
"Text1 c=""Cherry"""
をそのまま記述できます。 XML の文法としては認められていませんが、実体参照に変換して記述
する必要はありません。 ただし、属性値に実体参照や文字参照（例：&amp）と同じ形式（& から
始まり、英数字があり、; で終わる形式）の文字列を設定したいときだけは、
& を &amp; に置き換えてください。
"If ( c < d && e > f ) { a = ""Apple < > &"" }"
a="Apple < > &"
入力：
出力：
出力：
入力：
a= " < > &quot &quot;"
"a=' < > &quot &amp;quot;'"
&amp;quot;
&quot;
a= "1"+ vbCRLF +"2"
入力：
出力：
"a=""1"" a=""2"""
"a&#x3D;""A"""
出力：
attrs("")= "a=""A"""
入力：
T_ParseAttributesInXML
XML タグの属性の形式は、名="値" または 名='値' です。
文字列に = 文字を含む場合、XML タグの属性の可能性がありますが、= の左が解析対象の属性名
ではないときや、= の右が " または ' ではないときは、一般の文字列として扱われます。 XML の文法
としては認められていませんが、エラーにはなりません。 また、
in_AttributeNames 引数に指定した配列に空の文字列 "" が含まれるときは、XML タグの属性を
削除した残りの文字列を出力することができます。
XML 属性が削除した部分の空白の文字数は、XML 属性の両隣にある空白の文字数の小さいほう
になります。 ただし、前（左）の XML 属性が抜かれたときに右隣の空白が少なくなったら、次（右）の
XML 属性の左隣の空白はその少なくなった文字数が使われます。
実体参照や文字参照（例：&amp）
で記述すれば、XML タグの属性の形式と同じ形式の値も出力することができます（エスケープ）。
← ▼ ▲
DecodeCharacterReferencesOfXML
Function DecodeCharacterReferencesOfXML( in_String as string ) as string
をデコードします。
【引数】
in_String
返り値
実体参照や文字参照を含む文字列
実体参照や文字参照を対応する文字に変換した文字列
テスト
→ T_XML.vbs
ソース
→ vbslib.vbs
XML の実体参照や文字参照（例：&amp）
本関数の in_String 引数に指定できる「vbslib の XML 属性」 の文字列は、XML の文法と
しては認められていないもの（例： <, >, & が含まれている文字列）でも、ほぼ問題なく
解析できます。
参考
→ ParseAttributesInXML
a_string = DecodeCharacterReferencesOfXML( "&amp; &lt; &gt; &quot; & < >" )
Assert a_string = "& < > "" & < >"
サンプル
T_ParseAttributesInXML
"&amp; &lt; &gt; &quot; & < >"
"& < > "" & < >"
← ▼ ▲
CutIndentOfMultiLineText
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
ソース
→ MultiTextXML_Class
すべての行がインデントしてから（タブ文字や空白文字から）始まる場合、そのインデントを
カットします。 XML パーサーは、
先頭行が空行のときは、その先頭行をカットします（XML パーサーは、HTML パーサーと
異なり、先頭の空行をカットしません）。
最終行がインデントしかなく、末尾に改行文字がないときは、その最終行をカットします（XML
パーサーは、HTML パーサーと異なり、末尾の空行はカットしません）。
→ GetTab
→ XmlText
参考
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(改行)
^
参考
→ XMLを学ぼう（10）：落とし穴になる空白文字と改行文字 - ＠IT (Web)
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
in_Option 引数について
Empty または、下記の定数の論理和 (or) を指定できます。
g_VBS_Lib.CutLineSeparators
末尾が改行文字ならその改行を１つカットして返します。
→ 改行コードについて
カットした後の文字列
返り値
→ in_Option 引数について
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*&#9;">
Line1
Line2
</Text>
^ Line1
^ Line2
CutIndentOfMultiLineText
の返り値：
^ は、タブ文字
→ 改行コードについて
→ インデントと、上下の端の空行について
→ in_Option 引数について
→ サンプル
→ Translate コマンド >> サンプル ： 複数行のテキストを翻訳する
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 セクション
← ▼ ▲
MultiTextXML_Class
関連
<?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" を指定すると、下記の文字列が取得できます。
最後に改行が入りますが、アプリケーションによっては最後の改行を１つ削除します。
Sample.xml
ファイルのパス（アドレス）に "Sample.xml#second" を指定すると、下記の文字列が取得できます。
最後に改行が入りますが、アプリケーションによっては最後の改行を１つ削除します。
タグ名は、上記と異なるタグ名でも構いませんが、id 属性は必須です。
encoding 属性の設定値は、ファイルの文字コードの設定に合わせてください。
例： UTF-8、UTF-16、Shift_JIS など
マルチ・パート・テキストXML
複数のテキスト・ファイルを１つにまとめた XML ファイル。
先頭文字 （<![CDATA[ の直後） が改行文字の時は、その改行文字は取得されません。
改行文字から始めるときは、２つの改行文字をファイルに記述してください。
最初の行や最後の行が ---- のように - が４つ以上あるだけの行のときは、その行は取得され
ません。 コメントとして無視されます。 ---- から始まるテキストは、2行目から記述してください。
ファイルに同じ id 属性が存在すると、上の方にある部分のみ有効になります。
ファイルのパス（アドレス）に "Sample.xml" を指定すると、ファイルの全体の内容が取得できます。
マルチ・パート・テキストXML
→ MultiTextXML_Class (clib)
ファイルの内容を内部でキャッシュします。
参考
→ XML
----
→ GetText (MultiTextXML_Class)
→ IsExist (MultiTextXML_Class)
→ XML_ReadCacheClass
マルチ パート テキスト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
→ セクション化されたテキスト
→ CutIndentOfMultiLineText
を内部で呼び出しており、id 属性と供に cut_indent 属性が
CutIndentOfMultiLineText 関数
あれば、indent 属性や改行コードも指定することができます。
LF\n
CR+LF
←
↓