(for Internet Explorer)
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 属性の名前の配列
補足
" " で囲まれた属性値に " を含めるときは、&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 タグの属性の形式と同じ形式の値も出力することができます(エスケープ)。
Function  DecodeCharacterReferencesOfXML( in_String as string ) as string
をデコードします。
【引数】
in_String
返り値
実体参照や文字参照を含む文字列
実体参照や文字参照を対応する文字に変換した文字列
テスト
→ T_XML.vbs
ソース
→ vbslib.vbs
XML の実体参照や文字参照(例:&amp)
本関数の in_String 引数に指定できる「vbslib の XML 属性」 の文字列は、XML の文法と
しては認められていないもの(例: <, >, & が含まれている文字列)でも、ほぼ問題なく
解析できます。
参考
a_string = DecodeCharacterReferencesOfXML( "&amp; &lt; &gt; &quot; & < >" )
Assert  a_string = "& < > "" & < >"
サンプル
T_ParseAttributesInXML
"&amp; &lt; &gt; &quot; & < >"
"& < > "" & < >"
    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*&#9;">
        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