搜索给定值的类似元素列表

时间:2015-06-10 14:31:26

标签: ruby xpath nokogiri

我有一些像这样的XML:

<Team ...some attributes...>
  <Name>My Team</Name>
  <Player uID="player1">
    <Name>Name</Name>
    <Position>Goalkeeper</Position>
    <Stat Type="first_name">Name</Stat>
    <Stat Type="last_name">Last</Stat>
    <Stat Type="birth_date">bday</Stat>
    <Stat Type="birth_place">bplace</Stat>
    <Stat Type="weight">84</Stat>
    <Stat Type="height">183</Stat>
    <Stat Type="jersey_num">1</Stat>
  </Player>
  <Player uID="player2">
    ...
  </Player>
  ...
</Team>

我想通过jersey_num搜索玩家。我正在使用Nokogiri,这段代码让我有点接近:

feed.xpath("/Team[@uID='#{team_uid}']//Player/Stat[@Type='jersey_num']")

返回给定团队中的所有玩家,以及他们的球衣号码属性行数组,但我想找到一个具有给定球衣号码的球员,然后拉出uID

我可以用祖先做到这一点,但首先我需要这个搜索才能产生一个匹配的玩家。我意识到目前我没有搜索它,但我不确定如何使用Stat Type语法进行搜索。

2 个答案:

答案 0 :(得分:2)

  

&#34; ...但我希望找到一个具有给定球衣号码的球员,然后拉出它的uID&#34;

然后xpath参数看起来应该是这样的:

/Team[@uID='#{team_uid}']//Player[Stat[@Type='jersey_num' and .='#{jersey_num}']]/@uID

或者可能没有尾随/@uID来获取Player元素,然后从ruby代码中进一步提取。请注意Stat[....]部分在上面的xpath中按Stat属性值过滤Type元素和元素本身的值。

答案 1 :(得分:0)

这很有效,但我希望有更好的方法:

jersey_number = '23'
players = feed.xpath("/Team[@uID='#{team_uid}']//Player")
player = players.xpath("//Stat[@Type='jersey_num']").detect do |jersery|
  jersery.text == jersey_number
end
player
#=>#<Nokogiri::XML::Element:0x95e8f4 name="Stat" attributes=[#<Nokogiri::XML::Attr:0x9407dc name="Type" value="jersey_num">] children=[#<Nokogiri::XML::Text:0x940048 "23">]>