XPath Classic ASP - PullRequest
       14

XPath Classic ASP

0 голосов
/ 21 марта 2012

Очевидно, я бы лучше избил человека, который решил, что выплевывать xml следующим образом - хорошая идея, но, увы, я не могу. ; -)

У меня есть следующий xml:

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

Какой будет правильный xpath для вывода данных. Если бы, как и следовало ожидать, имена узлов были «ключом» каждый раз, следующий asp с xpath // search / key отлично справился бы с этой задачей. Тем не менее, я не могу определить правильный 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

1 Ответ

1 голос
/ 21 марта 2012

Во-первых, вы должны установить для свойства SelectionLanguage значение XPath или использовать определенную версию MSXML, которая использует XPath в качестве языка выбора по умолчанию.
Дополнительная информация: Свойство SelectionLanguage
Запрос, который вы должны использовать, чтобы получить узлы, имя которых начинается с "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
...