2012-03-21 277 views
0

很顯然,我寧願打電話決定吐出像以下這樣的XML是一個好主意的人,但唉,我不能。 ;-)XPath經典ASP

我有以下XML:

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

什麼是正確的XPath來獲取數據了。 如果應該,節點名稱每次都是'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最好的辦法是通過將它(使用XSLT)爲更好的XML啓動任務。那樣,處理不好的任務只需要做一次。 – 2012-03-21 08:34:35

+0

這似乎是正確的解決方法。非常感謝! – 2012-03-21 10:15:47

回答

1

首先,你應該SelectionLanguage屬性設置爲XPath或使用MSXML的特定版本,它使用XPath作爲其默認的選擇語言。
更多信息: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

更改爲MSXML2.DomDocument.4.0給出: 不要使用CreateObject來創建XML DOM文檔或XMLServerHTTP對象,而是使用Server.CreateXMLObject和Server.CreateXMLHTTPObject 但是我還沒有發現這個錯誤消息或CreateXMLObject或任何提及關於ASP的CreateXMLHTTPObject,但只有Javascript。 更改CreateObject來CreateXMLObject給我的參數或無效的屬性賦值 錯誤號碼錯誤:「Server.CreateXMLObject」 不幸的是使用的XPath與XMLDOM告訴我沒有找到結果。 – 2012-03-21 09:45:16

+0

我將此設置爲正確的答案,因爲使用此xpath以及@MichaelKay使用xslt的想法是我需要的一切。 – 2012-03-21 10:22:03