2017-04-24 5 views
0

Nokogiri :: XML 사용 다른 속성을 기반으로 속성 값을 검색하려면 어떻게해야합니까?Nokogiri :: 다른 XML 속성의 값을 기반으로 한 XML 구문 분석 값

XML 파일 :

<RateReplyDetails> 
    <ServiceType>INT</ServiceType> 
    <Price>1.0</Price> 
    </RateReplyDetails> 
    <RateReplyDetails> 
    <ServiceType>LOCAL</ServiceType> 
    <Price>2.0</Price> 
    </RateReplyDetails> 

그리고 2.0

나는이 어떤 조건없이 값을 취할 수있는 LOCAL ServiceType 자리의 가격 검색하고 싶은 :

rated_shipment.at('RateReplyDetails/Price').text 

아마도 다음과 같이 할 수 있습니다.

if rated_shipment.at('RateReplyDetails/ServiceType').text == "LOCAL" 
    rated_shipment.at('RateReplyDetails/Price').text 

하지만 그렇게 우아하고 깨끗한 방법이 있습니까?

답변

1

내가 좋아하는 뭔가를 할 것 . 우리가 다음 요소를보고 해당 텍스트를 쉽게 얻을 것을 발견하면

service_type.next_element.text # => "2.0" 

. XPath를 완전히

1

시도하면 content은 xml 콘텐츠 문자열입니다.

doc = Nokogiri::HTML(content) 
doc.at('servicetype:contains("INT")').next_element.content 

[16] pry(main)> 
doc.at('servicetype:contains("INT")').next_element.content 
=> "1.0" 
[17] pry(main)> 
doc.at('servicetype:contains("LOCAL")').next_element.content 
=> "2.0" 

나는 그것을 테스트하고있다.

require 'nokogiri' 

doc = Nokogiri::XML(<<EOT) 
<xml> 
<RateReplyDetails> 
    <ServiceType>INT</ServiceType> 
    <Price>1.0</Price> 
    </RateReplyDetails> 
    <RateReplyDetails> 
    <ServiceType>LOCAL</ServiceType> 
    <Price>2.0</Price> 
    </RateReplyDetails> 
</xml> 
EOT 

service_type = doc.at('//RateReplyDetails/*[text() = "LOCAL"]') 
service_type.name # => "ServiceType" 

'//RateReplyDetails/*[text() = "LOCAL"]'"LOCAL"에 해당하는 텍스트 노드를 포함하고 <ServiceType> 노드가 텍스트를 포함하는 노드를 반환 < RateReplyDetails> 노드를 검색하는 XPath 선택입니다 :

+0

하위 문자열 일치로 CSS의 '포함'을 사용하는 데주의하십시오. 즉 문자열의 어느 곳에서나 'INT'또는 'LOCAL'과 일치하여 잘못된 검색 결과가 발생할 수 있습니다. –

+0

내 텍스트가 매우 독특하기 때문에 이것이 나에게도 도움이 될 것입니다. 대답으로 첫 번째 대답과 정답을 선택했지만이 방법도 효과가 있습니다. 고마워요 – user664859

+0

@theTinMan 귀하의 상기시켜 주셔서 감사합니다, 사실, 내가 전에이 방법을 시도했지만, 실패, 지금은'텍스트'를 사용하는 올바른 방법을 알고,이 대답을 붙여 넣기 전에이 문제를 안다. 감사. –

0

:

rated_shipment.at('//RateReplyDetails[ServiceType="LOCAL"]/Price/text()').to_s 
# => "2.0" 

편집 :

#!/usr/bin/env ruby 
require 'nokogiri' 
rated_shipment = Nokogiri::XML(DATA) 
puts rated_shipment.at('//RateReplyDetails[ServiceType="LOCAL"]/Price/text()').to_s 
__END__ 
<xml> 
<RateReplyDetails> 
    <ServiceType>INT</ServiceType> 
    <Price>1.0</Price> 
    </RateReplyDetails> 
    <RateReplyDetails> 
    <ServiceType>LOCAL</ServiceType> 
    <Price>2.0</Price> 
    </RateReplyDetails> 
</xml> 
:

가 didnt 한 작업 증거로 나를

전체 코드가 작동하지 않습니다

(출력 : 2.0) 작동하지 않는 경우 파일 내용이 OP와 일치하지 않기 때문입니다.

+0

그것은 나를 위해 일하지 않았다 - 검색 후 부모에게 가야했다 – user664859