我打算从网页加载下面提到的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
答案 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