(for Internet Explorer)
← ▼ ▲
↑
MeltCSV
CSV 形式の１項目を取り出し、通常の文字列に戻す。
Function MeltCSV( Line as string, in_out_Start as integer ) as string
i = 1
Do
s = MeltCSV( line, i )
If not IsEmpty( s ) Then （s を使った処理）
If i = 0 Then Exit Do
Loop
【引数】
Line
in_out_Start
CSV 形式の１行
（入力） 取り出しを開始する文字の位置、（出力）次に取り出す〜
返り値
取り出した CSV 形式の１項目。Empty=項目に値が無い
サンプル
(src)
関連
各項目の両端の空白が削除されたものが戻ります。
次の項目が無いときは、i=0 になります。
i=0 を渡すと、Empty を返します。
→ T_CSV.vbs # main
テスト
→ ArrayFromCSV
← ▼ ▲
CSV_insert
→ T_CSV.vbs
ソース
Function CSV_insert( CSV_Line as string, RightColumnNum0 as integer, Element as variant )
as string
CSV 形式の１行に、要素を挿入します。
【引数】
CSV_Line
RightColumnNum0
CSV 形式の１行
挿入する位置の右の要素の番号（０以上）
テスト
→ vbslib.vbs
挿入した後の CSV 形式の１行
挿入する要素
Element
返り値
サンプル
Assert CSV_insert( "A,B,C", 1, "x" ) = "A,x,B,C"
Assert CSV_insert( "A,B,C", 4, "x" ) = "A,B,C,,x"
← ▼ ▲
CSV_set
→ T_CSV.vbs
ソース
Function CSV_set( CSV_Line as string, ColumnNum0 as integer, Element as variant )
as string
CSV 形式の１つの要素を上書きします。
【引数】
CSV_Line
ColumnNum0
CSV 形式の１行
上書きする要素の番号（０以上）
テスト
→ vbslib.vbs
上書きした後の CSV 形式の１行
上書きする要素
Element
返り値
サンプル
Assert CSV_set( "A,B,C", 1, "x" ) = "A,x,C"
Assert CSV_set( "A,B,C", 4, "x" ) = "A,B,C,,x"
← ▼ ▲
CSV_remove
→ T_CSV.vbs
ソース
Function CSV_remove( CSV_Line as string, ColumnNum0 as integer ) as string
CSV 形式の１つの要素を削除します。
【引数】
CSV_Line
ColumnNum0
CSV 形式の１行
削除する要素の番号（０以上）
テスト
→ vbslib.vbs
削除した後の CSV 形式の１行
返り値
サンプル
Assert CSV_remove( "A,B,C", 1 ) = "A,C"
Assert CSV_remove( "A,B,C", 4 ) = "A,B,C,"
Assert CSV_remove( "A,B,C,", 3 ) = "A,B,C"
削除する要素より前の要素が無いときは、前に空の要素が追加されます
← ▼ ▲
(XML) LoadXML
(src)
Function LoadXML( PathOrStr as string, Opt as variant ) as IXMLDOMElement
XML ファイル、または XML 形式の文字列を読み込みます。
【引数】
PathOrStr
XML ファイルのパス、または XML 形式文字列や
Opt
オプション（下記）
IXMLDOMElement
XML のルート要素
返り値
Opt 引数
F_NoRoot フラグ、g_VBS_Lib.NoRootXML
XML のルート要素が無い XML を読み込みます。 返り値は、内部で自動的に
加えられたルート要素 <Dummy_Root_> になります。
先頭が < でないときは、自動的にルート要素が加えられます。
F_Str フラグ、g_VBS_Lib.StringData
PathOrStr 引数を XML 形式文字列として処理します
サンプル： XML 形式文字列を展開する
Dim s : s = "ABC <TAG1 attr='value1'/> 123"
Dim root : Set root = LoadXML( s, F_NoRoot or F_Str )
Dim value : value = root.selectSingleNode( "./TAG1" ).getAttribute( "attr" )
'// value = "value1"
→ XML 要素へアクセスするその他のサンプル
関連
LoadXML
Dim root, elem, attr
Set root = LoadXML( "sample.xml", Empty )
'//=== read 1 attribute value
WScript.Echo root.selectSingleNode( "./Tests/Test" ).getAttribute( "result" )
'//=== read 1 text value
WScript.Echo root.selectSingleNode( "./Tests" ).text
Set node = root.selectSingleNode( "./Tests/text()" )
If not node is Nothing Then WScript.Echo node.nodeValue
'//=== loop each tags
For Each element In root.selectNodes( "./Tests/Test" )
WScript.Echo "result, "+ element.getAttribute( "result" )
Next
Set nodes = root.selectNodes( "./Tests" )
ReDim values( nodes.length - 1 )
For i=0 To UBound( values )
values(i) = nodes(i).text
Next
'//=== loop each attributes
For Each element In root.selectNodes( ".//Test" )
WScript.Echo "<" + element.tagName + ">"
For Each attribute In element.attributes
WScript.Echo attribute.name + "=" + attribute.value
Next
Next
サンプル : sample.xml ファイルをロードする
"sample.xml"
"./Tests/Test"
"./Tests/Test"
"result"
"result"
".//Test"
result
→ DOM サンプル
LoadXML
日本語があるときは、Unicode にするか、XML宣言で Shift-JIS を指定してください。
→ XmlFilter ツール (.zip)
テスト
→ T_XML フォルダー
サンプル： XML を結合する
Dim f, root, elem, attr
Set f = OpenForWrite( "FileAB.xml", Empty )
f.WriteLine "<TabA>"
Set root = LoadXML( "FileA.xml", Empty )
f.WriteLine XmlTags( root.selectSingleNode( "./TagB" ).xml, 1 )
Set root = LoadXML( "FileB.xml", Empty )
f.WriteLine XmlTags( root.selectSingleNode( "./TagB" ).xml, 1 )
f.WriteLine "</TabA>"
→ XML
参考
→ xml_sub 関数
./Tests/text()
関連
→ XmlRead
→ XmlRead
→ XmlRead
selectSingleNode
selectNodes
getAttribute
→ MultiTextXML_Class
→ Opt 引数
→ LoadXML_Cached
g_VBS_Lib.InheritSuperClass (SuperClassタグ)
SuperClass タグの属性を子タグにコピーして、id 属性を持たない SuperClass タグを
削除した XML データを返します。 super_class 属性を持つタグは、super_class 属性が
指す id 属性を持つ SuperClass タグの属性をコピーします。
参考： T_InheritSuperClassXML テスト
<SuperClass priority="1000">
<File path="*.c"/>
<File path="*.h"/>
</SuperClass>
<SuperClass priority="2000" id="Super1"/>
<File path="*.cpp" super_class="#Super1"/>
<File path="*.c" priority="1000"/>
<File path="*.h" priority="1000"/>
<SuperClass priority="2000" id="Super1"/>
<File path="*.cpp" super_class="#Super1" priority="2000"/>
FileA.xml ファイル
LoadXML の返り値の XML
FilePathClass
← ▼ ▲
LoadXML_Cached
Function LoadXML_Cached( PathOrStr as string, Opt as variant ) as IXMLDOMElement
IXMLDOMElement
LoadXML
XML を解析してできた DOM オブジェクトをキャッシュする
。
返り値がどの変数から参照されなくなっても、キャッシュのために、DOM オブジェクトはメモリー上に
残ります。 vbslib の内部に絶対パスをキー、DOM オブジェクトをアイテムとした辞書型のキャッシュ
があります。
ソース
→ vbslib.vbs
２回目以降の XML ファイルは、キャッシュによって XML を解析する処理がなくなり、高速に処理
します。
→ XML_ReadCacheClass
関連
キャッシュは、以下の変数です。
g_VBS_Lib.XML_DOM_ReadCache as dictionary key=path, item=IXMLDOMElement class
← ▼ ▲
XML_ReadCacheClass
XML ファイルの内容を内部でキャッシュします。
→ Item (XML_ReadCacheClass)
関連
→ LoadXML_Cached
← ▼ ▲
Item (XML_ReadCacheClass)
Default Property Get XML_ReadCacheClass::Item( URL as string ) as string
XML のテキスト、または、属性値を返します。
【引数】
URL
返り値
XML ファイルのパス +"#"+ XPath
XML のテキスト、または、属性値
サンプル
→ vbslib.vbs
ソース
Set files = new XML_ReadCacheClass
tag_text = files( "Sample.xml#/Root/Tag" )
'// tag_text = "The text"
Sample.xml#/Root/Tag
Sample.xml
VBScript
<Root>
<Tag>The text</Tag>
</Root>
→ T_XML.vbs # [T_XML_ReadCacheClass]
テスト
<< XML_ReadCacheClass
← ▼ ▲
OpenForReplaceXML
関連
→ OpenForReplace
Function OpenForReplaceXML( SrcPath as string, DstPath as string ) as ReplaceXmlFile1
XMLファイルの内容の変更を開始します。
【引数】
SrcPath
DstPath
変更前のテキストファイルのパス
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
Set xml = OpenForReplaceXML( "file1.xml", Empty )
xml.Write "/Root/Elem/@attr1", 11
xml.IsUserConfirm = True
xml = Empty '// デストラクタでユーザーの確認およびファイルの更新をする
file1.xml
/Root/Elem/@attr1
→ ReplaceXmlFile1 クラス
11
→ SetXmlAttribute
テスト
→ T_XML.vbs # [T_OpenForReplaceXML]
ReplaceXmlFile1 クラス
.Write
.IsUserConfirm
タグの間のテキスト、または XML 属性の値を変更します。
XML ファイルを変更する前に、ユーザーに確認をとるかどうか。
IsUserConfirm
→ T_XML_Manually.vbs # [T_OpenForReplaceXML_Manually]
→ ReplaceRange (ReplaceTextFile1)
Write
→ vbslib.vbs
サンプル
ソース
→ PositionOfXML_Class
← ▼ ▲
Write (ReplaceXmlFile1)
Sub ReplaceXmlFile1::Write( XPath as string, Value as string )
→ サンプル
XML のタグの間のテキスト、または XML の属性の値を変更します。
【引数】
XPath
タグの間のテキスト、または XML の属性の位置を表す XPath
返り値
変化があったかどうか
変更後のテキストまたは XML 属性の値、""=値なし、Empty=削除する
Value
→ XmlWrite
参考
→ OpenForReplaceXML
← ▼ ▲
SetXmlAttribute (ReplaceXmlFile1)
Sub ReplaceXmlFile1::SetXmlAttribute( XPathForXmlElement as string, AttrName as string,
AttrValue as string );
XML 属性の値を変更します。
【引数】
XPathForXmlElement
AttrName
属性を変更する XML 要素（タグ） への XPath。 フル・パス
XML 属性の名前
AttrValue
変更後の XML 属性の値
→ OpenForReplaceXML
→ サンプル
→ Write (ReplaceXmlFile1)
廃止されました。
← ▼ ▲
IsUserConfirm (ReplaceXmlFile1)
Dim ReplaceXmlFile1::IsUserConfirm as boolean
XML ファイルを変更する前に、ユーザーに確認をとるかどうかの設定値。
XML ファイルを更新する直前で、値が変わる属性とその値を表示します。
表示中に、ユーザーの確認入力があるまで待ちます。
→ OpenForReplaceXML
デフォルトは、False です。
/Root/Tests/Test1@attr1="1"
/Root/Tests/Test3@attr1="3"
更新ファイル：out.xml
XML ファイルの上記属性を変更します。
続行するには Enter キーを押してください . . .
確認画面の例：
→ サンプル
← ▼ ▲
OpenForAppendXml
Function OpenForAppendXml( SrcPath as string, DstPath as string ) as AppendXmlFile
XMLファイルの内容の追加を開始します。
【引数】
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じですが、
WriteXml メソッドが追加されています。
Modify.xml （処理前）
Modify.xml （処理後）
<Modify>
<Child1 value="1"/>
</Modify>
クローズするときに、ルートの XML タグ（XML要素）を閉じるタグを出力します。
よって、追加する内容は、ルートの XML タグの直下の末尾に限定されます。
Set file = OpenForAppendXml( "Modify.xml", Empty )
file.WriteLine "<Child2 value=""2""/> <!-- by WriteLine -->"
file.WriteXml ReadFile( "Add.xml" )
file = Empty
サンプル
<Modify>
<Child1 value="1"/>
<Child2 value="2"/> <!-- by WriteLine -->
<AddChild value="3"/>
</Modify>
<Add>
<AddChild value="3"/>
</Add>
Add.xml
追加する内容は、OpenForWrite と同様に WriteLine などのメソッドに XML の文字列を
指定します。 XPath ではありません。
→ WriteXml
テスト
→ T_XML.vbs # [T_OpenForAppendXml]
SrcPath
DstPath
変更前のテキストファイルのパス
変更後のテキストファイルのパス。 SrcPath と同じ、または Empty 可。
返り値
TextStream ＋ α のオブジェクト
(src)
← ▼ ▲
WriteXml (AppendXmlFile)
Sub AppendXmlFile::WriteXml( Xml as string )
指定した XML 文字列から、ルート XML タグを除いて追加します。
【引数】
Xml
追加する XML 文字列
file.WriteXml "<Root><Child/><Root>"
サンプル
サンプル
OpenForAppendXml( "Modify.xml", Empty ).WriteXml ReadFile( "Add.xml" )
<Child/> を追加します
Modify.xml に Add.xml を追加します。
Modify.xml （処理前）
Modify.xml （処理後）
<Modify>
<Child1 value="1"/>
</Modify>
<Modify>
<Child1 value="1"/>
<AddChild value="2"/>
</Modify>
<Add>
<AddChild value="2"/>
</Add>
Add.xml
(src)
← ▼ ▲
PositionOfXML_Class
文字列の中にある 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>
Load
SelectSingleNode
OpenForReplace
<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
関連
→ OpenForReplaceXML
XML要素を追加・変更・削除しても、空白の数や属性の順番が変わって、
XML 文書が崩れてしまうという XML規格の問題を回避することができます。
DOM
は使っていません。
T_PositionOfXML_TryUI
← ▼ ▲
Load (PositionOfXML_Class)
Sub PositionOfXML_Class::Load( in_FilePath as string )
XML ファイルをロードします。
【引数】
in_FilePath
ロードする XML ファイルのパス
ソース
<< PositionOfXML_Class
→ vbslib.vbs
← ▼ ▲
SelectSingleNode (PositionOfXML_Class)
Function PositionOfXML_Class::SelectSingleNode( in_XPath as string )
as PositionOfXML_ElementClass
指定した XML 要素を探して、その位置情報にアクセスするオブジェクトを返します。
【引数】
in_XPath
XML 要素を指す XPath。 ただし一部の形式のみ
ソース
→ vbslib.vbs
in_XPath 引数に指定できる
返り値
XML の位置情報にアクセスするオブジェクト または Nothing
PositionOfXML_ElementClass
PositionOfXML_ElementClass
//Tag[1]
//Tag[last()]
.PositionOfLeftOfStartTag
開始タグまたは空要素タグの行頭または前のタグの直後の文字の位置
.PositionOfNextOfEndTag
integer
integer
.PositionOfNextOfStartTag
以下は、まだ開発されていません。
integer
.PositionOfLeftOfFirstAttribute
.PositionOfNextOfLastAttribute
integer
integer
終了タグまたは空要素タグの次の行の先頭または終了タグの直後の文字の位置
開始タグの次の行の先頭または開始タグの直後の文字の位置
最初の属性の行頭またはタグ名の直後の文字の位置
最後の属性の次の行の先頭または最後の属性の直後の文字の位置
参考
→ XML 1.1 - 3.1 Start-Tags, End-Tags, and Empty-Element Tags (Web)
<< PositionOfXML_Class
以下のプロパティから、XML タグの前後などの文字の位置を取得できます。
文字の位置は、VB の InStr 関数などで扱う位置と同じで、先頭が 1 で、文字単位で +1 した整数値です。
ファイルのバイナリの位置とは異なります。
* <Tag>
<Sub/>
</Tag>
+
*
<Previous/>* <Tag/>+ <Next/>
同じ行に別のタグがないとき：
同じ行に別のタグがあるとき：
+
* = PositionOfLeftOfStartTag が指す文字
+ = PositionOfNextOfEndTag が指す文字
*
+
厳密にいえば、同じ行に別のタグがあるかどうかではなく、
タグの左の位置のプロパティは、同じ行の左側に別のタグがるかどうか、
タグの次の位置のプロパティは、同じ行の右側に別のタグがるかどうかです。
同じ行の右側に別のタグがあっても、タグの左の位置のプロパティは、
上記の「同じ行に別のタグがないとき」に該当します。
+ = PositionOfNextOfEndTag が指す文字
* = PositionOfLeftOfStartTag が指す文字
XPath
は、以下の形式のみです。
該当する XML 要素がなければ、Nothing を返します。
[ ] の中は、1以上の整数です。 要素数(=last()) より大きいときは、Nothing を返します。
← ▼ ▲
XmlRead
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)
→ RegRead
サンプル
Set root = LoadXML( "in.xml", Empty ) '// as IXMLDOMElement
value = XmlRead( root, "./Tag1/@attr1" )
Tag1/@attr1
XmlRead
→ CutIndentOfMultiLineText
関連
XML のタグの間の複数行のテキスト
→ XmlReadBoolean
ソース
→ vbslib.vbs
T_XmlRead
→ LinkedXMLs クラス
#付き RUL、name 属性、id 属性
←
↓