2015-06-10 3 views
0

У меня есть 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

»... но я хочу найти игрока с данным номером джерси, а затем потяните его Uid»

Тогда параметр XPath должен выглядеть примерно так:

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

или, возможно, с выведите /@uID, чтобы получить элемент Player, а затем выполните дальнейшую извлечение из кода ruby. Обратите внимание, что Stat[....] часть в приведенных выше фильтрах xpath Stat элемент по Type значение атрибута и по значению самого элемента.

+1

, который прекрасно работает, я знал, что это можно сделать с помощью xpath. Спасибо – dax

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">]> 
+0

Это ваш ответ или код, который должен был быть включен в вопрос? –

+1

Не делайте такие вещи, как 'jersery.text == jersey_number'. «Текст» может содержать пробелы, такие как пробелы, вкладки, новые строки, возврат каретки, неразрывные пробелы, т. Е. Вещи, которые НЕ являются тем, с чем вы хотите сравнить. Вместо этого очистите текст перед сравнением. –

+0

@theTinMan, это ответ - он возвращает то, что я хотел, но я думаю, что это не здорово ... то, что вы сказали о jersey.text, возможно, является одной из причин. спасибо за этот отзыв, хотя, я буду держать это в виду, продвигаясь вперед – dax

Смежные вопросы