次のようなテーブルがあるとします。
SELECT TOP 5 * FROM [actor.txt]
----------------------------------------------------------------
|actor_id|first_name|last_name |last_update |
| 1|PENELOPE |GUINESS |2/15/2006 4:34:33 AM|
| 2|NICK |WAHLBERG |2/15/2006 4:34:33 AM|
| 3|ED |CHASE |2/15/2006 4:34:33 AM|
| 4|JENNIFER |DAVIS |2/15/2006 4:34:33 AM|
| 5|JOHNNY |LOLLOBRIGIDA|2/15/2006 4:34:33 AM|
----------------------------------------------------------------
ADO (クラシック、バージョン 2.8 でテスト済み) でアクセス可能なデータベースでは、次を使用して結果セットを XML に保存できます。
oRS.Save sFSpec, adPersistXML
これにより、次のような XML が得られます。
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly'>
<s:AttributeType name='actor_id' rs:number='1' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='i2' dt:maxLength='2' rs:precision='5' rs:fixedlength='true'/>
</s:AttributeType>
<s:AttributeType name='first_name' rs:number='2' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='string' dt:maxLength='45'/>
</s:AttributeType>
<s:AttributeType name='last_name' rs:number='3' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='string' dt:maxLength='45'/>
</s:AttributeType>
<s:AttributeType name='last_update' rs:number='4' rs:nullable='true' rs:maydefer='true' rs:writeunknown='true'>
<s:datatype dt:type='dateTime' rs:dbtype='variantdate' dt:maxLength='16' rs:fixedlength='true'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row actor_id='1' first_name='PENELOPE' last_name='GUINESS' last_update='2006-02-15T04:34:33'/>
<z:row actor_id='2' first_name='NICK' last_name='WAHLBERG' last_update='2006-02-15T04:34:33'/>
<z:row actor_id='3' first_name='ED' last_name='CHASE' last_update='2006-02-15T04:34:33'/>
<z:row actor_id='4' first_name='JENNIFER' last_name='DAVIS' last_update='2006-02-15T04:34:33'/>
<z:row actor_id='5' first_name='JOHNNY' last_name='LOLLOBRIGIDA' last_update='2006-02-15T04:34:33'/>
</rs:data>
</xml>
そのデータを読み取るには、次のような (ローカル、コンソール) コードから始めます。
Dim oFS : Set oFS = CreateObject( "Scripting.FileSystemObject" )
Dim sDDir : sDDir = oFS.GetAbsolutePathName( "..\Data" )
Dim sFSpec : sFSpec = oFS.GetAbsolutePathName( "..\Data\actor.xml" )
Dim oXDoc : Set oXDoc = CreateObject("msxml2.domdocument")
Dim sXPath, ndFnd, ndlFnd, attrX, nIdx
oXDoc.async = False
oXDoc.validateOnParse = False
oXDoc.resolveExternals = False
oXDoc.setProperty "SelectionLanguage", "XPath"
oXDoc.setProperty "SelectionNamespaces", Join( Array( _
"xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'" _
, "xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'" _
, "xmlns:rs='urn:schemas-microsoft-com:rowset'" _
, "xmlns:z='#RowsetSchema'" _
), " ")
If oXDoc.load(sFSpec) Then
WScript.Echo sFSpec, "looks good."
For Each sXPath In Array( _
"/xml" _
, "/xml/s:Schema" _
, "/xml/rs:data" _
, "/xml/rs:data/z:row[@actor_id=""2""]" _
)
WScript.Stdout.Write "|" & sXPath & "| => "
Set ndFnd = oXDoc.selectSingleNode( sXPath )
If ndFnd Is Nothing Then
WScript.Stdout.WriteLine "not found"
Else
WScript.Stdout.WriteLine "found a(n) " & ndFnd.tagName
End If
Next
WScript.Echo "-----------------------"
'<rs:data>
' <z:row actor_id='1' first_name='PENELOPE' last_name='GUINESS' last_update='2006-02-15T04:34:33'/>
' ...
'</rs:data>
sXPath = "/xml/rs:data/z:row[@actor_id=""3""]"
Set ndFnd = oXDoc.selectSingleNode( sXPath )
If ndFnd Is Nothing Then
WScript.Echo "|", sXPath, "| not found"
Else
For Each attrX In ndFnd.Attributes
WScript.Echo attrX.Name, attrX.Value
Next
End If
WScript.Echo "-----------------------"
sXPath = "/xml/rs:data/z:row"
Set ndlFnd = oXDoc.selectNodes( sXPath )
If ndlFnd Is Nothing Then
WScript.Echo "ndlFnd Is Nothing"
Else
If 0 = ndlFnd.Length Then
WScript.Echo "ndlFnd is empty"
Else
For Each ndFnd In ndlFnd
WScript.Echo TypeName(ndFnd)
For Each attrX In ndFnd.Attributes
WScript.Echo "", attrX.Name, attrX.Value
Next
Next
End If
End If
Else
WScript.Echo "Bingo!"
WScript.Echo oXDoc.parseError.reason
End If
重要な手順:
- 開発/テストでは、サーバーを使用することによる余分な複雑さを回避します。cscript readxml.vbs が成功した場合、作業コードを .asp に「移植」するのは簡単です (サーバー固有の問題を個別に処理します)。
- msxml2.dom ドキュメントを作成する
- それを構成します。特に名前空間を xml タグから SelectionNamespaces にコピーします。
- ファイルをロードし、エラーをチェックします
- XPath 式を指定します (慎重に! XML をサンプルから XPATH に「変換」してみてください)。
- .selectSingleNode() と .selectNodes() の結果を確認する
- データを保持する属性にアクセスする