2016-09-16 2 views
0

아래쪽에서 작업중인 비누 응답을 게시하고 있습니다.
나는 해시로 전체 일을집니다 <t:Body BodyType="HTML">savon 응답에서 속성을 구문 분석하는 방법

response.body을 수행에서 BodyType="HTML" 속성을 잡기 위해 필요로하고 있다는 점에서 BodyType="HTML"의 흔적이 없다.

Doing response.doc.css("t|Body")은 XML에 네임 스페이스 선언이 표시되지 않기 때문에 Undefined namespace prefix: //t:Body (Nokogiri::XML::XPath::SyntaxError) 오류를 생성합니다.

Doing response.doc.css("Body") 빈칸 반환.

BodyType 값을 검색하려면 어떻게해야합니까?

require 'savon' 
require 'active_support/core_ext/hash/conversions' 
require 'nokogiri' 

@doc = Nokogiri::XML(File.open("tmp.xml")) 
puts @doc.css("t|Body") 

을 그리고 여기에 XML의 : 보안/개인 비누 요청을 코드를 게시 아무 문제가 없기 때문에

, 나는 플랫 파일에서 XML을 읽 몇 가지 기본적인 코드를 게시하고있다 :

<?xml version="1.0" encoding="utf-8"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <h:ServerVersionInfo xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" MajorVersion="15" MinorVersion="1" MajorBuildNumber="629" MinorBuildNumber="8" Version="V2016_07_13"/> 
    </s:Header> 
    <s:Body> 
    <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
     <m:ResponseMessages> 
     <m:GetItemResponseMessage ResponseClass="Success"> 
      <m:ResponseCode>NoError</m:ResponseCode> 
      <m:Items> 
      <t:Message> 
       <t:ItemId Id="AAMkADE2NjQyMjVlLWNhY2UtNDNiMS04MzgxLWZiNzEyNzA0NDgwNQBGAAAAAACLt5QBAQ/GRYv+vEXkY5vLBwA6ksGFFTICTbjFW6e9FfRGAAAAAAEMAAA6ksGFFTICTbjFW6e9FfRGAAAu8FruAAA=" ChangeKey="CQAAABYAAAA6ksGFFTICTbjFW6e9FfRGAAAu9iR3"/> 
       <t:ParentFolderId Id="AAMkADE2NjQyMjVlLWNhY2UtNDNiMS04MzgxLWZiNzEyNzA0NDgwNQAuAAAAAACLt5QBAQ/GRYv+vEXkY5vLAQA6ksGFFTICTbjFW6e9FfRGAAAAAAEMAAA=" ChangeKey="AQAAAA=="/> 
       <t:ItemClass>IPM.Note</t:ItemClass> 
       <t:Subject>From test</t:Subject> 
       <t:Sensitivity>Normal</t:Sensitivity> 
       <t:Body BodyType="HTML">Hello world</t:Body> 
      </t:Message> 
      </m:Items> 
     </m:GetItemResponseMessage> 
     </m:ResponseMessages> 
    </m:GetItemResponse> 
    </s:Body> 
</s:Envelope> 
+0

코드에 관해 묻는 경우 문제를 설명하는 데 필요한 절대적인 수준으로 입력을 줄이십시오. 다른 방법은 우리가 그것을하도록 강요하고 잠재적으로 유사한 솔루션을 찾는 다른 사람들을 혼란스럽게함으로써 우리의 시간을 낭비합니다. "[mcve]"및 [Stack Overflow 사용자에 대한 연구 노력의 정도는 얼마입니까?] (http://meta.stackoverflow.com/a/261593/128421)를 읽어보십시오. –

답변

0

네임 스페이스는 실제로 바다를 진흙탕으로 만들 수 있습니다.

기본적으로 Nokogiri는 루트 노드에서 네임 스페이스 선언을 조사하므로 xmlns:t이 루트 노드에 정의되어있는 경우 t|Body이 작동합니다.

그러나 그렇지 않았기 때문에 collect_namespaces을 사용하여 Nokogiri가 문서를 검색하고 찾은 모든 문서의 해시를 작성하도록해야합니다. 당신이 collect_namespaces 설명서를 읽어 보면

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<?xml version="1.0" encoding="utf-8"?> 
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
    <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
     <t:Message> 
     <t:Body BodyType="HTML">Hello world</t:Body> 
     </t:Message> 
    </m:GetItemResponse> 
    </s:Body> 
</s:Envelope> 
EOT 
ns = doc.collect_namespaces # => {"xmlns:s"=>"http://schemas.xmlsoap.org/soap/envelope/", "xmlns:t"=>"http://schemas.microsoft.com/exchange/services/2006/types", "xmlns:m"=>"http://schemas.microsoft.com/exchange/services/2006/messages"} 
doc.at("t|Body", ns)['BodyType'] # => "HTML" 

당신은 키가 이전에 발견 덮어 쓸 수 반환 된 잠재적 인 문제가 있다고 볼 수 있습니다 : 그럼 당신은, searchcss, at하거나 검색 방법을 그 해시를 전달할 수 있습니다 선언. s:Body 내부에만 네임 스페이스의 해시 발생합니다

ns = doc.at('s|Body').first_element_child.namespaces 
# => {"xmlns:m"=>"http://schemas.microsoft.com/exchange/services/2006/messages", "xmlns:t"=>"http://schemas.microsoft.com/exchange/services/2006/types", "xmlns:s"=>"http://schemas.xmlsoap.org/soap/envelope/"} 

: 이러한 문제가 있다면 당신은 s:Body 노드를 찾아, 다음의 첫 번째 자식 요소는 다음 네임 스페이스를 수집하는 것으로 해결할 수