我有一些像这样的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
语法进行搜索。
答案 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">]>