如何从网页加载xml文件并从xml读取特定节点?

时间:2014-04-28 12:32:20

标签: ruby xpath nokogiri

我打算从网页加载下面提到的xml,然后想要从中读取特定的节点。过滤条件:if" displayname"属性包含" isc-asr901a"它应该选择第一个节点并返回属性" id"节点ethernetProtocolEndpointExtendedDTO"

的值
<queryResponse type="EthernetProtocolEndpoint">
<entity >
<ethernetProtocolEndpointExtendedDTO id="2283315" displayName="4c2b8aa7[2275273_isc-      asr901a,GigabitEthernet0/0]">
<name>GigabitEthernet0/0</name>
<adminStatus>UP</adminStatus>
</ethernetProtocolEndpointExtendedDTO>
</entity>
<entity >
<ethernetProtocolEndpointExtendedDTO id="2283315" displayName="4c2b8aa7[2275273_isc-asr901a,GigabitEthernet0/0]">
<name>GigabitEthernet0/0</name>
<adminStatus>UP</adminStatus>
</ethernetProtocolEndpointExtendedDTO>
</entity>
</queryResponse>

我打算用ruby来做这件事。但我是红宝石的新手。有人可以帮助我执行此操作。通过使用哪个解析器,我可以轻松地做到这一点?我使用下面的代码来执行此操作,但代码没有返回任何值。

strurl = "https://.."
doc = Nokogiri::HTML(open(strurl))  
doc.xpath('//queryResponse/entity/ethernetProtocolEndpointDTO[@displayName="[^"]*isc-asr901a[^"]*]').each do |node|          
puts node['id']
end

谢谢, Chandana

1 个答案:

答案 0 :(得分:1)

您需要使用Nokogiri::XML,而不是Nokogiri::HTML,因为这是一个XML。此外,您在ethernetProtocolEndpointExtendedDTO中输了一个拼写错误 - 您写了ethernetProtocolEndpointDTO

此外,您应该使用contains查找包含字符串的显示名称:

strurl = "https://.."
doc = Nokogiri::XML(open(strurl))  
doc.xpath('//queryResponse/entity/ethernetProtocolEndpointExtendedDTO[contains(@displayName, "isc-asr901a")]').each do |node|          
  puts node['id']
end
# => 2283315