所以我得到了一个带有模式(XML模式(的XML文件(XML文件(。
我正在尝试创建一个快速的Rails应用程序,允许用户基于"lastName"元素搜索XML文件,这些元素是sdEntry元素的子元素。
我在设置rails应用程序或搜索表单时没有任何问题。我还能够使用Nokogiri加载XML文件,并且可以运行简单的命令,比如。。。
xmldoc.css("lastName")
返回一个NodeSet,其中包含所有的"lastName"元素。不幸的是,这还不够好,因为它不仅列出了"sdEntry"元素正下方的"lastName"元素。另外,这甚至还没有让我开始从表单中插入用户的输入。我在想这样的方法会奏效。。。
xmldoc.xpath("/xmlns:sdnList/sdnEntry/lastName[text()='#{param[:name]}']")
但那没用。奇怪的是,我连。。。
xmldoc.xpath("/xmlns:sdnList/sdnEntry/lastName")
工作。我对Nokogiri、XPath或CSS查询XML文档的了解还不够,无法弄清楚如何从用户输入表单传递参数来创建合适的查询,从而为我返回正确的信息。
我试着浏览了Nokogiri文档和W3Schools XPath教程。没有快乐。
如果有任何提示、代码片段或建议,我将不胜感激。非常感谢。
您的问题是Nokogiri使用的XPath。您需要指定属性中的命名空间。更多信息请访问Nokogiri文档。
下面是一个查找项目的例子,使用params可能也会起作用。
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.">]>]
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()
感兴趣,而不需要确切的文本值。