2016-11-17 3 views
1

nokogiri으로 간단한 XML 데이터를 구문 분석하려고합니다. 이 내 XML입니다 :Nokogiri : NoMethodError (nil 클래스에 대해 정의되지 않은 메소드 'inner_html')

POST /.... HTTP/1.1 
Host: .... 
Content-Type: text/xml; charset=utf-8 
Content-Length: length 
SOAPAction: "http://...." 

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:xsi="...." xmlns:xsd="...." xmlns:soap="...."> 
    <soap:Body> 
    <WS_QueryOnSec xmlns="......"> 
     <type>string</type> 
     <ID>string</ID> 
    </WS_QueryOnSec> 
    </soap:Body> 
</soap:Envelope> 

이 내 simle 요청입니다 :

require "nokogiri" 
@doc = Nokogiri::XML(request.body.read) 
@something = @doc.at('type').inner_html 

그러나 노코 기리가 입력하거나 ID 노드를 찾을 수 없습니다. 나는이에 데이터를 변경하면 모든 일이 잘 작동 :

<soap:Body> 
     <type>string</type> 
     <ID>string</ID> 
    </soap:Body> 

문제가 데이터와의 xmlns 또는 다른 속성을 고개를 끄덕 위의 원시 텍스트 보인다! 이 문제를 해결하려면 무엇을 권하고 싶습니까?

+0

"XML"은 XML이 아닙니다. XML을 포함하는 텍스트입니다. 헤더 정보를 빈 줄까지 제거하십시오. XML 스펙을 읽고 XML 작성에 대한 자습서를 읽는 것이 도움이 될 것이라고 생각합니다. –

+0

@ The Tin Man 그러나 태그에 포함 된 속성은 어떻게됩니까? 텍스트를 제거하면 여전히 동일합니다! 속성을 포함하는 전체 태그를 제거 할 때까지! 고맙습니다. –

답변

1

첫 번째 "XML"은 XML이 아닙니다. XML을 포함하는 텍스트입니다. 헤더 정보를 빈 줄까지 제거하고 다시 시도하십시오.

XML spec을 읽거나 정의 방법을 이해하는 데 도움이되는 XML 작성에 대한 자습서를 읽는 것이 도움이 될 것이라고 생각합니다. XML은 엄격한 지정이며 어떤 편차도 허용하지 않습니다. 구문은 매우 유연하지만 규칙에 따라 플레이해야합니다.

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<root> 
    <node /> 
</root> 
EOT 

doc.errors # => [] 

<root>가 굳이 용 "루트"의 이름이 아닌 : 적절한 해석의 루트 태그 결과를 외부에 텍스트를 제거

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
foo 

<root> 
    <node /> 
</root> 
EOT 

doc.errors # => [#<Nokogiri::XML::SyntaxError: Start tag expected, '<' not found>] 

:

다음 예를 고려해 노드 일 경우 가장 바깥 쪽 태그 일뿐입니다.

여전히 유효 DO가 발생합니다. M : 문서의 내부 표현 :

puts doc.to_html 

# >> <foo> 
# >> <node></node> 
# >> </foo> 

XML 샘플이 사안을 다소 복잡하게 만드는 네임 스페이스를 사용하고 있습니다. Nokogiri documentation은 XML 처리 방법에 대해 설명하므로 XML을 파싱하는 부분을 다시 이해하게 될 것이므로 XML 해석 부분을 이해하고 싶을 것입니다. 다음은 그 (것)들을 사용하는 쉬운 방법입니다 :

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<?xml version="1.0" encoding="utf-8"?> 
<Envelope xmlns:xsi="...." xmlns:xsd="...." xmlns:soap="...."> 
    <Body> 
    <WS_QueryOnSec xmlns="......"> 
     <type>string</type> 
     <ID>string</ID> 
    </WS_QueryOnSec> 
    </Body> 
</Envelope> 
EOT 

namespaces = doc.collect_namespaces 

doc.at('type', namespaces).text # => "string" 
+0

고맙습니다. @ theTinMan. 확실히 구조를 아는 데 도움이 될 수 있습니다. –

+0

@ theTinMan 고마워요! 당신은 그것을 찔렀다 :) –

+0

그런데 @ the-tin-man은 Nogokiri에서 xml로부터 텍스트를 나눌 방법이 있나? –