2011-11-05 2 views
1

그래서 XML 파일 (XML file)과 스키마 (XML schema)가 있습니다. 나는 사용자가 sdnEntry 요소의 자식 인 '이 lastName "요소를 기반으로 XML 파일을 검색 할 수 있도록 빠른 레일에게 응용 프로그램을 만들려고 해요Nokogiri를 사용하여 Rails 앱에서 사용자 입력을 기반으로 XML 파일을 검색합니다.

.

나는 어떤 문제 설정이 없습니다 레일 응용 프로그램, 또는 검색 폼까지. 내가 가진 노드 집합을 반환 ...

xmldoc.css("lastName") 

... 또한 노코 기리를 사용하여 같은 간단한 명령을 실행할 수 있습니다로드 된 XML 파일을 얻을 수 있었다 모든 ' lastName '요소를 포함하고 있습니다. 불행히도'lastName '요소가'sdnEntry '요소 바로 아래에 나열되어 있지 않으므로 충분하지 않습니다. 양식의 사용자 입력을 삽입하기 시작했습니다. 이런 일이 일어날 것이라고 생각했는데 ...

xmldoc.xpath("/xmlns:sdnList/sdnEntry/lastName[text()='#{param[:name]}']") 

...하지만 그건 작동하지 않았습니다. 이상하게도, 나는 심지어 얻을 수 없었다 ...

xmldoc.xpath("/xmlns:sdnList/sdnEntry/lastName") 

.... XML 정보에 대한 Nokogiri 또는 XPath 또는 CSS 쿼리에 대해 알지 못해 사용자 입력 양식의 매개 변수를 전달하여 적절한 정보를 반환하는 적절한 쿼리를 만드는 방법을 알아 냈습니다.

Nokogiri DocumentationW3Schools XPath Tutorial을 살펴 보았습니다. 기쁨이 없습니다.

나는 모든 포인터, 코드 스 니펫 또는 제안을 정말 고맙게 생각합니다. 고맙습니다.

+0

네임 스페이스와 nokogiri에 대한 자세한 내용은 http://stackoverflow.com/questions/4690737/nokogiri-xpath-namespace-query/4691008#4691008 –

답변

1
user_input = "CHOMBO"    # However you are getting it 
doc = Nokogiri.XML(myxml,&:noblanks) # However you are getting it 
doc.remove_namespaces!    # Simplify your life, if you're just reading 

# Find all sdnEntry elements with a lastName element with specific value 
sdnEntries = doc.xpath("/sdnList/sdnEntry[lastName[text()='#{user_input}']]") 

sdnEntries.each do |sdnEntry| 
    p [ 
    sdnEntry.at_xpath('uid/text()').content, # You can get a text node's contents 
    sdnEntry.at_xpath('firstName').text  # …or get an element's text 
    ] 
end 
#=> ["7491", "Ignatius Morgan"] 
#=> ["9433", "Marian"] 
#=> ["9502", "Ever"] 

대신 정확한 텍스트 값을 요구하는, 당신은 또한 XPath 함수 contains() 또는 starts-with()에 관심이있을 수 있습니다.

2

Nokogiri가 사용중인 XPath에 문제가 있습니다. 네임 스페이스가 특성에있는 것을 지정해야합니다. Nokogiri documentation에서 자세한 정보를 얻을 수 있습니다.

다음은 매개 변수를 사용하여 항목을 찾는 예제입니다.

doc = Nokogiri::XML(File.read("sdn.xml")) 
doc.xpath("//sd:lastName[text()='INVERSIONES EL PROGRESO S.A.']", "sd"=>"http://tempuri.org/sdnList.xsd") 

>> [#<Nokogiri::XML::Element:0x80b35350 name="lastName" namespace=#<Nokogiri::XML::Namespace:0x80b44c4c href="http://tempuri.org/sdnList.xsd"> children=[#<Nokogiri::XML::Text:0x80b34e3c "INVERSIONES EL PROGRESO S.A.">]>] 
+0

답장을 보내 주셔서 감사합니다. 위의 대답은 조금 더 일찍 왔고 내가 관심을 가질만한 관련 XPath 함수에 대한 정보도 포함되었습니다. 감사 – GreenPlastik

관련 문제