2012-03-21 4 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'인 경우 // 검색/키의 xpath와 함께 다음 asp가 작업을 완벽하게 수행합니다. 그러나, 나는 올바른 일을 할 수 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

. 그런 식으로 나쁜 일을 처리하는 일은 한 번만해야합니다. –

+0

이것은이 문제를 해결하는 올바른 방법 인 것 같습니다. 정말 고마워요! MSXML2.DomDocument.4.0로 변경 –

답변

1

먼저 덕분에, 당신의 XPath에 SelectionLanguage 속성을 설정하거나 기본 선택 언어로 XPath를 사용 MSXML의 특정 버전을 사용해야합니다.
더 많은 정보 : SelectionLanguage Property
당신은 이름이 노드를 얻기 위해 사용해야 쿼리는 "KEY_"로 시작 :

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

테스트 스크립트 당신의 XML 문서를 기반으로, 고려하십시오. 당신이 저조한 가장 좋은 것은 더 나은 XML로 (XSLT 사용)을 변환하여 시작하는 것입니다 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 또는 언급하지만 ASP에 관해서는 CreateXMLHTTPObject를 작성하지만 Javascript 만 사용하십시오. CreateObject를 CreateXMLObject로 변경하면 오류가 발생합니다. 잘못된 인수 또는 잘못된 속성 할당 : 'Server.CreateXMLObject' 불행히도 xpath를 XMLDOM과 함께 사용하면 결과가 없습니다. –

+0

이 xpath를 사용할 때 @MichaelKay가 xslt를 사용한다는 아이디어와 함께 올바른 답이되도록 설정했습니다. 필요한 모든 것입니다. –