2014-10-10 2 views
0

У меня есть маленький XML-файл, который я пытаюсь сначала захватить с помощью прокси-сервера away_team, а затем second_team second. /game/team/statistics/@ goal дает мне данные, которые я хочу, но мне нужно изменить порядок. Поэтому я пытаюсь понять, как сначала получить цели away_team, а затем home_team.пытаясь разобрать конкретные данные с помощью xpath

Ниже файл

<game id="f24275a9-4f30-4a81-abdf-d16a9aeda087" status="closed" coverage="full" home_team="4416d559-0f24-11e2-8525-18a905767e44" away_team="44167db4-0f24-11e2-8525-18a905767e44" scheduled="2013-10-10T23:00:00+00:00" attendance="18210" start_time="2013-10-10T23:08:00+00:00" end_time="2013-10-11T01:32:00+00:00" clock="00:00" period="3" xmlns="http://feed.elasticstats.com/schema/hockey/game-v2.0.xsd"> 
    <venue id="bd7b42fa-19bb-4b91-8615-214ccc3ff987" name="First Niagara Center" capacity="18690" address="One Seymour H. Knox III Plaza" city="Buffalo" state="NY" zip="14203" country="USA"/> 
    <team name="Sabres" market="Buffalo" id="4416d559-0f24-11e2-8525-18a905767e44" points="1"> 
    <scoring> 
     <period number="1" sequence="1" points="1"/> 
     <period number="2" sequence="2" points="0"/> 
     <period number="3" sequence="3" points="0"/> 
    </scoring> 
    <statistics goals="1" assists="2" penalties="7" penalty_minutes="23" team_penalties="0" team_penalty_minutes="0" shots="27" blocked_att="14" missed_shots="8" hits="25" giveaways="5" takeaways="10" blocked_shots="7" faceoffs_won="22" faceoffs_lost="28" powerplays="1" faceoffs="50" faceoff_win_pct="44.0" shooting_pct="3.7" points="3"> 
     <powerplay faceoffs_won="2" faceoffs_lost="0" shots="0" goals="0" missed_shots="1" assists="0" faceoff_win_pct="100.0" faceoffs="2"/> 
     <shorthanded faceoffs_won="3" faceoffs_lost="3" shots="1" goals="0" missed_shots="0" assists="0" faceoffs="6" faceoff_win_pct="50.0"/> 
     <evenstrength faceoff_win_pct="40.5" missed_shots="7" goals="1" faceoffs_won="17" shots="26" faceoffs="42" faceoffs_lost="25" assists="2"/> 
     <penalty shots="0" goals="0" missed_shots="0"/> 
    </statistics> 
    <shootout shots="0" missed_shots="0" goals="0" shots_against="0" goals_against="0" saves="0" saves_pct="0"/> 
    <goaltending shots_against="33" goals_against="4" saves="29" saves_pct="0.879" total_shots_against="33" total_goals_against="4"> 
     <powerplay shots_against="0" goals_against="0" saves="0" saves_pct="0"/> 
     <shorthanded shots_against="7" goals_against="0" saves="7" saves_pct="1.0"/> 
     <evenstrength goals_against="4" saves_pct="0.846" shots_against="26" saves="22"/> 
     <penalty shots_against="0" goals_against="0" saves="0" saves_pct="0"/> 
     <emptynet goals_against="0" shots_against="0"> 
     <powerplay goals_against="0"/> 
     <shorthanded goals_against="0"/> 
     <evenstrength goals_against="0"/> 
     </emptynet> 
    </goaltending> 
+0

XPath 1.0 или 2.0? То, что вы хотите, возможно в версии 2.0, но не в 1.0. –

+0

Также XML, который вы указали в вопросе, включает только одну команду (и не очень хорошо сформирован, так как отсутствует количество закрывающих тегов). Можете ли вы расширить его, чтобы показать обе команды? Я предполагаю, что это совпадение между атрибутами 'home_team' и' away_team' '' '' и 'id'' команды', которая сообщает вам, какой командой является какая. –

+0

Ian, я предоставил только фрагмент, потому что XML-файл на самом деле является каналом, который вытаскивается каждые 30 секунд. То, что мне нужно сделать, - это изменить порядок работы домашних и выездных команд. Я очень новичок в xpath, поэтому я был бы невежественным, если бы попытался привести пример, но моя система, в которую я помещал фид в захватывающие цели/цели/команды/статистику/@, поэтому я предполагаю, что могу что-то положить/game (position)/team/statistics/@ goal – minor76

ответ

2

Вот +2,0 выражения XPath, которое должно делать то, что вы просили, что дает последовательность из двух элементов:

(/game/team[@id = /game/@home_team]/statistics/@goals, 
/game/team[@id = /game/@away_team]/statistics/@goals) 

Кредита на @Ian для слежки в деталях вопроса.

В XPath 1.0, можно сцепить строки данных из двух команд в любом порядке:

concat(/game/team[@id = /game/@home_team]/statistics/@goals, ' ', 
     /game/team[@id = /game/@away_team]/statistics/@goals) 

Но, как сказал Ян, вы не можете создать набор узлов с заказом, отличным от того документа. (Я не думаю, что имеет множество узлов любой присущую порядок вообще ... это, как она обрабатывается, что накладывает заказ.)

Update:

Как Ян отметил, что ваши данные XML в пространстве имен, благодаря объявлению пространства имен по умолчанию на <game>. Поскольку вы сказали, что «/ game/team/statistics/@ goals дает мне данные», я предполагаю, что вы уже позаботились об этом аспекте проблемы, возможно, объявив пространство имен по умолчанию в среде выполнения XPath.

+0

Как бы объединить это в одно утверждение вместо двух? – minor76

+0

+1, хотя обратите внимание, что с учетом 'xmlns =" ​​http://feed.elasticstats.com/schema/hockey/game-v2.0.xsd "на корневом элементе вашего XML вам нужно настроить свой движок XPath с этим как пространство имен по умолчанию. –

+0

@IanRoberts: Спасибо за улов. Я не прокрутил это далеко вправо! Будет редактировать. – LarsH

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