2012-01-27 21 views
1

在庫管理システムのMicrosoft行セットスキーマを使用して戻ってくる行セットがあります。XML行セットとMsXML2

Set objXmlHttp = Server.CreateObject("Msxml2.ServerXMLHTTP") 
objXmlHttp.open "POST", address, False 
objXmlHttp.setRequestHeader "Content-Type", "text/xml" 
objXmlHttp.Send strXml 

Set objLst = XML_response.getElementsByTagName("data") 
myValue = objLst.item(0).getAttribute("field") 
:ドキュメントを読むためにMSXML2を使用した場合

しかし、私は(VBScriptで記述)

<xml> 
    <s:schema> 
     <!-- Schema here --> 
    </s:schema> 
    <rs:data> 
     <z:row field="value" field1="value" /> 
    </rs:data> 
</xml> 

私が使用しています。このバックを引っ張ってデータにアクセスすることはできていないようです

Microsoft VBScript runtime error '800a01a8' 

Object required: 'objLst.item(...)' 

これはおそらく、私は完全にWR何かをやっている:私は次のメッセージを受け付けておりますが

もしそうなら、誰かが私にこれを指摘することができました。私は今2時間これを見つめたので、私はそれを手に入れることができません。

+1

私は、これはあなたが望むもの_exactly_されていない知っているが、XMLは、ADODBレコードセットを使用すると、XMLオブジェクトのストレートを読み込むことができます使用して同じスキーマである場合'dim rs:set rs = CreateObject(" ADODB.RecordSet "):rs.open XML_Response' –

答えて

1

のようなテーブルを考える:あなたは があなたにXMLを与える

oRS.Save sFSpec, adPersistXML 

を使用してXMLに結果セットを保存することができ、(バージョン2.8でテスト古典的な、)ADOアクセス可能なデータベース内

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| 
---------------------------------------------------------------- 

like:

<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.domdocument
  • を作成します。特に
  • あなたのXPath式を指定してエラーをチェックし、 SelectionNamespacesにXMLタグから
  • ロードファイルを名前空間をコピー(慎重に!XPATHへのあなたのサンプルからXML「を翻訳し」にしてみてください)
  • をチェック.selectSingleNodeの結果()と.selectNodes()
  • アクセス
+0

静的コンテンツの代わりにリモートコードを一番上に追加し、それを修正して私が望むものを見つけました。結果ビンゴ!どうもありがとうございました。 – HAWood

1

は、あなたが投稿XML)正しい名前空間のエイリアスが含まれており、b)は、それが正しくXML_responseにロードされたことを前提としますデータを保持する属性。

これを行う「正しい」方法は、XPathを使用することですが、ここでは簡単なコードで目標を達成できます。 MSXML(3以下)のデフォルトの選択言語はXSLパターンです。この選択は名前空間の別名を理解しないため、<rs:data>の視点からはタグ名 "rs:data"は "data"ではありません。あなたが間違っていることが最初のことです。

もう1つのことは、getElementsByTagが「rs:data」というノードを1つだけ含むノードのコレクションを返すことです。あなたのコードは、実際には "z:row"の子ノードにあるそのノードから "field"属性を読み取ろうとしています。ここで

あなたはコードがどのように見えるかです:

Dim objData: Set objData = XML_response.documentElement.selectSingleNode("rs:data") 

Dim row 
Dim fieldVal, field1Val 
For Each row in objData.selectNodes("z:row") 
    fieldVal = row.getAttribute("field") 
    field1Val = row.getAttribute("field1") 

    ''# Do stuff with your fields for each row found. 
Next 
+0

これはまさに私のオリジナルの方法ですが、それはメソッドではなくxmlが返された方法でした。ドキュメントはそれを述べていませんが、行セットxmlは別のxmlドキュメントでラップされていました。つまり、内側のxmlを先に引っ張らなければなりませんでした。私がこれを最初に見つけなかったのは、loadXMLを使用したときに、実際に誤った形式でエラーが発生していないにもかかわらず、内部XMLを返すだけだったからです。非常に非常に奇妙な出現が、あなたの助けをあなたに感謝しました。 – HAWood

関連する問題