(for Internet Explorer)
文字列の中にある XML要素の文字位置を調べます。 内部で
Set xml = new PositionOfXML_Class

xml.Load  "Data.xml"

Set test_tag = xml.SelectSingleNode( "//Tag[1]" )
current_pos = test_tag.PositionOfLeftOfStartTag
next_pos    = test_tag.PositionOfNextOfEndTag

Set  file = OpenForReplace( "Data.xml",  Empty )
text_0 = Left( file.Text,  current_pos - 1 )
text_1 = Mid( file.Text,  current_pos,  next_pos - current_pos )
text_2 = Mid( file.Text,  next_pos )

file.Text = text_0 + _
    vbTab +"<Test"+ vbCRLF +"name=""A""/>"+ vbCRLF + _
    text_1 + _
    vbTab +"<Test"+ vbCRLF +"name=""B""/>"+ _
    text_2
file = Empty
サンプル
Data.xml
<X><Tests>
    <Test
        name="0"/>
    <Test
        name="1"/>
</Tests></X>
<X><Tests>
    <Test
        name="A"/>
    <Test
        name="0"/>
    <Test
        name="B"/>
    <Test
        name="1"/>
</Tests></X>
<Test
<Test
<Test"+ vbCRLF +"name=""A""/>
<Test"+ vbCRLF +"name=""B""/>
name="B"/>
name="A"/>
MS-XML の DOM では、以下のように整形された XML しか保存できません。
<X>
    <Tests>
        <Test name="A"/>
        <Test name="0"/>
        <Test name="B"/>
        <Test name="1"/>
    </Tests>
</X>
上記スクリプトは、たとえば以下の編集を行います。
テスト
→ T_XML.vbs
T_PositionOfXML
ソース
→ vbslib.vbs
関連
XML要素を追加・変更・削除しても、空白の数や属性の順番が変わって、
XML 文書が崩れてしまうという XML規格の問題を回避することができます。
DOM
は使っていません。
T_PositionOfXML_TryUI
Sub  PositionOfXML_Class::Load( in_FilePath as string )
XML ファイルをロードします。
【引数】
in_FilePath
ロードする XML ファイルのパス
ソース
→ vbslib.vbs
Function  PositionOfXML_Class::SelectSingleNode( in_XPath as string )
    as PositionOfXML_ElementClass
指定した XML 要素を探して、その位置情報にアクセスするオブジェクトを返します。
【引数】
in_XPath
XML 要素を指す XPath。 ただし一部の形式のみ
ソース
→ vbslib.vbs
in_XPath 引数に指定できる
返り値
XML の位置情報にアクセスするオブジェクト または Nothing
//Tag[1]
//Tag[last()]
開始タグまたは空要素タグの行頭または前のタグの直後の文字の位置
integer
integer
.PositionOfNextOfStartTag
以下は、まだ開発されていません。
integer
.PositionOfLeftOfFirstAttribute
.PositionOfNextOfLastAttribute
integer
integer
終了タグまたは空要素タグの次の行の先頭または終了タグの直後の文字の位置
開始タグの次の行の先頭または開始タグの直後の文字の位置
最初の属性の行頭またはタグ名の直後の文字の位置
最後の属性の次の行の先頭または最後の属性の直後の文字の位置
参考
以下のプロパティから、XML タグの前後などの文字の位置を取得できます。
文字の位置は、VB の InStr 関数などで扱う位置と同じで、先頭が 1 で、文字単位で +1 した整数値です。
ファイルのバイナリの位置とは異なります。
*   <Tag>
        <Sub/>
    </Tag>
+
*
<Previous/>*   <Tag/>+   <Next/>
同じ行に別のタグがないとき:
同じ行に別のタグがあるとき:
+
* = PositionOfLeftOfStartTag が指す文字
+ = PositionOfNextOfEndTag が指す文字
*
+
厳密にいえば、同じ行に別のタグがあるかどうかではなく、
タグの左の位置のプロパティは、同じ行の左側に別のタグがるかどうか、
タグの次の位置のプロパティは、同じ行の右側に別のタグがるかどうかです。
同じ行の右側に別のタグがあっても、タグの左の位置のプロパティは、
上記の「同じ行に別のタグがないとき」に該当します。
+ = PositionOfNextOfEndTag が指す文字
* = PositionOfLeftOfStartTag が指す文字
XPath
は、以下の形式のみです。
該当する XML 要素がなければ、Nothing を返します。
[ ] の中は、1以上の整数です。 要素数(=last()) より大きいときは、Nothing を返します。
Function  XmlRead( in_BaseXmlElement as IXMLDOMElement,  in_XPath as string ) as string
XML のタグの間のテキスト、または XML の属性の値を取得します。
【引数】
in_BaseXmlElement
in_XPath
in_XPath の基準となる XML要素(タグ)
タグの間のテキスト、または XML の属性の位置を表す in_XPath
返り値
テキストまたは XML 属性の値。文字列型
タグの間のテキストは、厳密には in_XPath = "/Root/Elem/text()" ですが、in_XPath =
"/Root/Elem" を指定してください。

in_XPath に指定したタグ(XML要素)やXML属性が存在しないときは、Empty を返します。

in_XPath が相対パスのときは、in_BaseXmlElement のタグが基準になります。
in_XPath にフル・パスを指定することもできます。
参考
テスト
→ T_XML.vbs
→ getAttribute (IXMLDOMElement)
サンプル
    Set root = LoadXML( "in.xml", Empty )  '// as IXMLDOMElement
    value = XmlRead( root, "./Tag1/@attr1" )
Tag1/@attr1
XmlRead
関連
XML のタグの間の複数行のテキスト
ソース
→ vbslib.vbs
T_XmlRead
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( "in.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 タグを取得します。
他の 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
直前のリンク先のパス、# を含む場合もある
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 セクション