2012-06-23 4 views
0

일부 웹 서비스 응답 XML에서 노드를 선택하려고합니다. 어떤 이유로 나는 루트 노드 ("xmldata")를 선택할 수 있지만 더 깊이 드릴을 시도하면 ("xmldata/customers") 모든 것이 비어있게됩니다! 아래는 웹 서비스가 반환하는 XML의 샘플입니다.VBScript XML 노드를 선택할 수 없습니다.

<xmldata> 
    <customers> 
    <customerid>22506</customerid> 
    <firstname>Jim</firstname> 
    <issuperadmin>N</issuperadmin> 
    <lastname>Jones</lastname> 
    </customers> 
</xmldata> 

여기에 고객 ID, 이름 및 성을 선택하려고 시도하는 코드가 있습니다.

' Send the Xml 
oXMLHttp.send Xml_to_Send 

' Validate the Xml 
dim xmlDoc 
set xmlDoc = Server.CreateObject("Msxml2.DOMDocument") 
xmlDoc.load (oXMLHttp.ResponseXML.text) 
if(len(xmlDoc.text) = 0) then 
    Xml_Returned = "<B>ERROR in Response xml:<BR>ERROR DETAILS:</B><BR><HR><BR>" 
end if 

dim nodeList 
Set nodeList = xmlDoc.SelectNodes("xmldata/customers") 

For Each itemAttrib In nodeList 
    dim custID, custLname, custFname  
    custID =itemAttrib.selectSingleNode("customerid").text 
    custLname =itemAttrib.selectSingleNode("lastname").text 
    custFname =itemAttrib.selectSingleNode("firstname").text 
    response.write("News Subject: " & custID) 
    response.write("<br />News Subject: " & custLname) 
    response.write("<br />News Date: " & custFname) 
Next 

위의 코드 결과는 zilch! 아무 것도 페이지에 쓰여지지 않습니다. 하나의 이상한 것은 내가 루트 요소를 선택하고 길이를 다음과 같이 얻는 것입니다.

Set nodeList = xmlDoc.SelectNodes("xmldata") 
Response.Write(nodeList.length) '1 is written to page 

그것은 정확하게 내가 다음 노드 아래 다음과 같은 시도하지만 1의 길이를 결정;

Set nodeList2 = xmlDoc.SelectNodes("xmldata/customers") 
Response.Write(nodeList.length) '0 is written to page 

길이가 0을 반환합니다. 이유는 무엇입니까?

이 노드의 값에 액세스하려고 시도한 유일한 방법은 아닙니다. 나는 단지 내가 잘못하고있는 것을 해결할 수 없다. 누군가 나를 도울 수 있었습니까? 건배.

답변

0

좋아, 그래서 내가 마침내 내가 잘못하고있는 일을 해결했습니다. XML을 웹 서비스에서 가져 왔기 때문에 XML에 대한 정보가 제한적 이었으므로 다음과 같이 XML을 페이지에 작성하여 구조화 된 구조를 볼 수있었습니다.

Response.Write oXMLHttp.ResponseXml.xml 

어떤 이유로 (누군가이 부분을 채울 수 있음) 모든 XML 태그를 소문자로 씁니다. 조사가 끝나고 다음을 수행 한 후에 이것이 진실이 아니라는 사실을 알게되었습니다.

dim nodeList 
Set nodeList = xmlDoc.SelectNodes("//xmldata/") 

for each item In nodeList 
    response.write(item.text & " -> Tag Name: " & item.nodeName & "<br />") 
Next 

'this wrote the following to the page 
'22506 -> Tag Name: CustomerID 
'Jim -> Tag Name: FirstName 
'N -> Tag Name: IsSuperAdmin 
'Jones 2 -> Tag Name: LastName 

'nodeName'속성 출력에는 낙타의 태그가 표시되어 있습니다. 따라서 ResponseXML은 오해의 소지가 있으며 XPath가 대소 문자를 구분한다는 사실이 문제의 노드를 선택하지 못하게합니다.

2

짧은 대답

oXMLHttp.ResponseXML.text 일부 텍스트를 반환 할 수 있지만, .load의 매개 변수를 필요로하지 'XML 파일의 위치를 ​​지정하는 URL이 포함 된 문자열'. 즉, 그렇게 말 '작동하지 않는'경우에 따라서

xmlDoc.loadXml oXMLHttp.ResponseXML.xml 

xmlDoc.load (oXMLHttp.ResponseXML.text) 

교체; 그런 다음 더 긴 대답을 제공하려고 노력할 것입니다.

짧은 대답

(PS : AnthonyWJones '두 번 XML을 변환하는 조언 하지은 소리 나는이 제공하는'하지, 첫 번째 장애물이 구약을 얻을 수있는 희망 기존 코드 '접근에 미치는 영향을 최소화 일반적으로 적용 가능한 전략은.)

이상이 ASP 페이지에 XML 문제가있는 경우, 당신은 콘솔 스크립트에서 XML 특정 문제를 분리하고 테스트하도록해야

에 응답합니다.

Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
    Dim sFSpec : sFSpec = oFS.GetAbsolutePathName("..\data\00.xml") 
    Dim oXml : Set oXml = CreateObject("Msxml2.DOMDocument") 

    oXml.setProperty "SelectionLanguage", "XPath" 
    oXml.async = False 
    oXml.load sFSpec 

    If 0 = oXml.parseError.errorCode Then 
    WScript.Echo "loaded:", sFSpec 
    WScript.Echo "root:", oXml.documentElement.tagName 

    Dim sXPath, ndlFnd, ndChild, ndFnd 

    sXPath = "/xmldata/customers" 
    Set ndlFnd = oXml.selectNodes(sXPath) 
    If 0 = ndlFnd.length Then 
     WScript.Echo "no '" & sXPath & "' found" 
    Else 
     WScript.Echo "found", ndlFnd.length, "node(s) for '" & sXPath & "'" 
     sXPath = "firstname" 
     For Each ndChild In ndlFnd 
      WScript.Echo "child:", ndChild.tagName 
      Set ndFnd = ndChild.selectSingleNode(sXPath) 
      If ndFnd Is Nothing Then 
       WScript.Echo "no '" & sXPath & "' found" 
      Else 
       WScript.Echo ndFnd.text, "==", ndChild.childNodes(1).text 
      End If 
     Next 
    End If 
    Else 
    WScript.Echo "errorCode:", oXml.parseError.errorCode 
    WScript.Echo oXml.parseError.reason 
    End If 

출력 :

loaded: E:\trials\SoTrials\answers\11166940\data\00.xml 
root: xmldata 
found 1 node(s) for '/xmldata/customers' 
child: customers 
Jim == Jim 

당신이

를 볼 수있는 문제를 위해 나는 XPath와 DOM 트리를 통해 액세스 노드에 코드 골격 (부하 .xml 파일 오류를 확인)를 작성
  1. 단일 단계의 결과를 확인하기 위해 표준/승인 된 방법을 사용합니다 (예 : 부두 길이 테스트 대신 parseError). 올바른 형식의/유효/사용 가능한 문서가 있는지 확인하십시오.
  2. 의심 스럽다면 VBScript가 물을 공급해야하는지에 대한 내 가정을 확실히하기 위해 WScript.Echo를 넣었습니다.
+0

안녕하세요 Ekkerhard, 답장을 보내 주셔서 감사합니다. 나는 당신이 제안한 것을 시도해 보았고 xmldata 노드보다 더 깊은 것을 선택하려고 할 때 여전히 같은 문제를 겪고있다. – urbanMethod

+0

연장 응답에 대한 환호. 내 문제는 대소 문자를 구분 (나는 세부 사항을 게시했습니다) 관련되었다. 나는 다음 번에 XML 문제에 관해 게시 한 콘솔 스크립트에 균열이 생길 것입니다. – urbanMethod

2

오프 스톱이 일을 먼저 :

응답에 XML 다른에 당신이 다음 다음 (다시) 구문 분석 문자열 (.XML)로 다시 변환 할 물어 DOM으로 파싱
Dim doc : Set xmlDoc = CreateObject("MSXML2.DOMDocument") 
xmlDoc.LoadXML (oXmlHttp.responseXML.xml) 

DOM (.LoadXML).

단순히이 마십시오

Dim xmlDoc : Set xmlDoc = oXmlHttp.responseXML 

가 두 번째로 당신이 당신의 대답 XPath를 올바른지는 대소 문자를 구분합니다 (떨어져 Ekkehard 이미 지적했다는 .text의 노는에서) 그래서 당신의 XPath를하다이 때문에 작동하지 않을 것입니다 당신이 얻고있는 xml은 당신이 생각하는 것과 일치하지 않았습니다.

마지막으로 "Camel casing"의 정의는 다양하지만 일반적으로이 "postalAddress"는 낙타 케이스이며 "PostalAddress"는 "Pascal casing"이라고합니다.

+0

짧은 답변에 결함을 지적 해 주셔서 감사합니다. –

+0

답장을 보내 주신 Anthony에게 감사드립니다. 그러나, 나는 여전히 주요 문제가 모든 태그가 소문자로 된 이유가 된 실제 문제에 대한 답을 갖고 있지 않습니다. 내가 지적한 것은 모든 코드 오류가 실제로 실험에 기인 한 것이고 문제를 일으키지 않았기 때문입니다. 추신. 어퍼 카멜 사건이 당신을 달래 준다고 말할 수 있습니까? :) – urbanMethod

+0

"모든 태그를 소문자로 만들었습니다"라는 것을 어떻게 발견했는지 모르겠습니다. MSXML은 그렇게하지 않습니다. 아마 당신이 어떻게이 현상을 관찰 할 수 있었는지 자세하게 묘사한다면? – AnthonyWJones

관련 문제