2012-03-21 28 views
0

明らかに、私は次のようなxmlを吐くことが良いアイデアだと決断した人をむしろ打ち負かすのですが、悲しいかな私はできません。データを取得するための正しいXPathのだろう何XPathクラシックASP

<search> 
    <key_0> 
     <ContentTitle>blah</ContentTitle> 
    </key_0> 
    <key_1> 
     <ContentTitle>blah blah</ContentTitle> 
    </key_1> 
</search> 

:;-)

は、私は次のXMLを持っています。 ノード名が毎回 'key'だった場合、次のaspは// search/keyのxpathで完全にジョブを実行します。しかし、私はこれを行うための正しいxpath /方法、あるいはそうでない場合にコードを修正する方法を理解することはできません。

誰でも任意のアイデア?

Dim mydoc : Set mydoc=Server.CreateObject("Microsoft.XMLDOM") 
mydoc.async=false 
mydoc.loadXML(xmlFile) 

If mydoc.parseError.errorcode<>0 then 
    Response.write mydoc.parseError.errorcode & " is the error code!<br />" 
Else 
    Set xmlPNode = mydoc.selectNodes("//search/key") 

    If(xmlPNode.Length=0) Then 
     response.write "No results found!" 
    Else 
     Dim iTotalResults : iTotalResults = (xmlPNode.Length - 1) 
     Dim i 
     For i = 0 to iTotalResults 
      strContentTitle=GetXMLItem("ContentTitle", i) 
     Next 
End If 
Set xmlPNode = Nothing 
End if 


Function GetXMLItem(strpItem, ipValue) 
    Dim nlOutput : Set nlOutput = xmlPNode(ipValue).selectNodes(strpItem) 
    If(nlOutput.Length<>0) Then 
     GetXMLItem=nlOutput(0).Text 
    Else 
     GetXMLItem="" 
    End If 
End Function 
+0

は時々あなたが最もよい事設計が不十分なXMLを処理するタスクを持っている場合は、より良いXMLに(XSLTを使用して)それを変換することによって開始することです。そうすれば、悪いことを処理する作業は一度しか行われなくてはなりません。 –

+0

これは正しい方法です。とてもありがとう! MSXML2.DomDocument.4.0に変更 –

答えて

1

まずおかげで、あなたは、XPathにSelectionLanguageプロパティを設定したり、デフォルトの選択の言語としてXPathを使用してMSXMLの特定のバージョンを使用する必要があります。
詳細情報:SelectionLanguage Property
あなたは、名前のノードを取得するために使用すべきクエリが「KEY_」で始まる:

search/*[starts-with(name(), 'key_')]

テストスクリプトXMLドキュメントに基づいて、検討してください。

Dim xmlFile 
    xmlFile = "<search><key_0><ContentTitle>blah</ContentTitle></key_0>" & _ 
    "<key_1><ContentTitle>blah blah</ContentTitle></key_1></search>" 
Dim mydoc 
Set mydoc = Server.CreateObject("MSXML2.DomDocument.4.0") 'by default selection language is XPath 
    'mydoc.setProperty "SelectionLanguage", "XPath" 
    mydoc.async=false 
    mydoc.loadXML xmlFile 
If mydoc.parseError.errorcode <> 0 Then 
    Response.Write mydoc.parseError.errorcode & " is the error code!<br />" 
Else 
    Dim xmlPNode 
    Set xmlPNode = mydoc.selectNodes("search/*[starts-with(name(), 'key_')]/ContentTitle") 
    If xmlPNode.Length = 0 Then Response.Write "No results found!" 
    Dim nodeTitle 
    For Each nodeTitle In xmlPNode 
     Response.Write nodeTitle.parentNode.nodeName & " : "& nodeTitle.nodeTypedValue & "<br />" 
    Next 
    Set xmlPNode = Nothing 
End If 
Set mydoc = Nothing 
+0

ができます: はServer.CreateXMLObjectとServer.CreateXMLHTTPObject を使用する代わりに、XMLのDOMDocumentまたはXMLServerHTTPオブジェクトを作成するためにCreateObjectを使用しないでください、私はこのエラーメッセージを発見していないか、いずれかがCreateXMLObjectかの言及がCreateXMLHTTPObjectはASPに関連していますが、Javascriptのみです。 CreateObjectをCreateXMLObjectに変更すると、エラーが発生します 引数の数が不正であるか、プロパティの割り当てが無効です: 'Server.CreateXMLObject' XMLDOMでxpathを使用すると、結果が見つかりません。 –

+0

これを正しい答えに設定しています。このxpathを使用すると、@MichaelKayのxsltを使用するというアイデアは、私が必要とするすべてです。 –