2009-05-06 3 views
1

SOAP 웹 서비스의 응답을 구문 분석하려고하지만 데이터의 일부에 잘못된 xmlns 요소가 있기 때문에 문제가 발생하지 않습니다.Delphi - IXMLNode의 잘못된 네임 스페이스 URI

내가 작업하고있는 XML의 일부는 다음과 같습니다.

<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <ResponseData xmlns="http://www.example.com/WebServices/Schemas/1"> 
     <ResponseDataResult> 
      <Messages xmlns="http://www.example.com/WebServices/Schemas/2"> 
       <Message>...</Message> 
      </Messages> 
     </ResponseDataResult> 
     ... 
    </ResponseData> 
</soap:Body> 

비누의 XMLNS URI : 바디 노드가 OK이고, 무효 인 드 responseData에있는 그것의 하나는, 그것은 전혀 존재하지 않는 문서를 가리 킵니다. 웹 서비스 그래서이 질문 :(를 벗어 고정 내 통제하에 아니라는 것을 주목해야한다.

내 델파이 (2007) 코드 모양을, 현재,이 같은 것을.

var l_tmp,l_tmp2,FSOAPBody:IXMLNode; 

begin 
    ... 

    FSOAPBody := FSOAPEnvelope.ChildNodes.FindNode('Body','http://schemas.xmlsoap.org/soap/envelope/'); 
    //returns the xml above. 
    if (FSOAPBody = nil) then exit; 

    l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData',''); 
    if (l_tmp = nil) or (not l_tmp.HasChildNodes) then exit; 

    l_tmp2 := l_tmp.ChildNodes.FindNode('ResponseDataResult',''); 

    ... 
end; 

위의 코드에서는 빈 이름 공간 URL을 FindNode('ResponseData','') 코드에 추가해야만했습니다. 아무 것도 찾지 못하고 nil을 반환하지만 예상 XML을 다시 가져옵니다.

문제는 다음 찾기 노드 (ChildNodes.FindNode('ResponseDataResult',''))는 l_tmp의 ChildNodes에 액세스하려고 할 때 액세스 위반을 일으키며 다음을 사용하여 xml을 볼 수 있습니다. l_tmp.xml 그리고 기대하는 XML인지 확인하십시오.

필자는 네임 스페이스가 누락 된 것으로 판단하여이를 제거하려고 시도했지만 읽기 전용 속성이라는 오류가 더 많이 발생합니다.

어쨌든 xmlns 속성을 제거하거나 NS에 관계없이 노드를 선택 하시겠습니까? 또는 나는이 잘못에 대하여 가고 있는가?

답변

2

예상되지 않음 모든 네임 스페이스 URI는 실제 리소스를 참조합니다. 그것들은 주로 고유 한 식별자로 사용되므로 여러 소스의 XML이 서로 간섭하지 않고 동일한 이름을 사용할 수 있습니다. 이들은 네임 스페이스의 유효한 요소와 속성 값을 설명하는 스키마를 가리킬 필요가 없습니다. XML은 그러한 스키마가 존재할 것을 요구하지도 않습니다.

네임 스페이스를 고려하지 않고 요소를 검색하려면 FindNode의 단일 인수 버전을 호출하십시오.

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData'); 

2 개의 인수 버전

는 네임 스페이스를 필요로하고, 당신이 빈 문자열을 지정하는 경우, 그것은 당신이 빈 네임 스페이스가있는 경우에만 노드를 요청하는 것을 의미한다. 네임 스페이스가 무엇인지 분명히 알고 있기 때문에 body 요소를 가져 오는 데 사용한 것과 같이 어쨌든 두 개의 인수 버전을 호출 할 수 있습니다.

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData', 
      'http://www.example.com/WebServices/Schemas/1');