Импорт в R: XML данных с повторяющимися узлами - PullRequest
0 голосов
/ 04 мая 2020

Изучаю R и изучаю его, но не могу обойтись без импорта XML данных во фрейм данных. Я продолжаю получать сообщения об ошибках, за которыми следую, и считаю, что это связано с тем фактом, что существует несколько дочерних узлов с одинаковыми именами. Любая помощь в правильном получении приведенных ниже данных в df будет принята с благодарностью.

Это та часть, где, как мне кажется, возникает проблема. В каждом экземпляре несколько ярлыков.

<instance>
      <ID>1</ID>
      <start>2.32</start>
      <end>22.32</end>
      <code>Rachel</code>
      <label> ### don't think label is necessary ###
        <group>Team</group> ### this should be the column name ###
        <text>Team A</text> ### this is the data ###
      </label>
      <label>
        <group>Action</group> ### this should be the column name ###
        <text>Passes accurate</text> ### this is the data ###
      </label>
      <label>
        <group>Half</group>
        <text>1st half</text>
      </label>
      <pos_x>52.4</pos_x>
      <pos_y>33.7</pos_y>
    </instance>

Я ожидаю, что это будет выглядеть так ...

ID  START   END     CODE    TEAM    ACTION          Half        POS_X   POS_Y
1   2.32    22.32   Rachel  Team A  Passes accurate 1st Half    52.4    33.7

Вот пример оригинального XML. Мне нужны только данные, содержащиеся в ALL_INSTANCES. Спасибо за вашу помощь!

<?xml version="1.0" encoding="utf-8"?>
<file>
  <SORT_INFO>
    <sort_type>sort order</sort_type>
  </SORT_INFO>
  <ALL_INSTANCES>
    <instance>
      <ID>1</ID>
      <start>2.32</start>
      <end>22.32</end>
      <code>Rachel Sparrow</code>
      <label>
        <group>Team</group>
        <text>Team A</text>
      </label>
      <label>
        <group>Action</group>
        <text>Passes accurate</text>
      </label>
      <label>
        <group>Half</group>
        <text>1st half</text>
      </label>
      <pos_x>52.4</pos_x>
      <pos_y>33.7</pos_y>
    </instance>
    <instance>
      <ID>2</ID>
      <start>2.32</start>
      <end>22.32</end>
      <code>Rachel Sparrow</code>
      <label>
        <group>Team</group>
        <text>Team A</text>
      </label>
      <label>
        <group>Action</group>
        <text>Positional attacks</text>
      </label>
      <label>
        <group>Half</group>
        <text>1st half</text>
      </label>
      <pos_x>52.4</pos_x>
      <pos_y>33.7</pos_y>
    </instance>
    <instance>
      <ID>3</ID>
      <start>3.02</start>
      <end>23.02</end>
      <code>Taylor Heard</code>
      <label>
        <group>Team</group>
        <text>Team B</text>
      </label>
      <label>
        <group>Action</group>
        <text>Tackle</text>
      </label>
      <label>
        <group>Half</group>
        <text>1st half</text>
      </label>
      <pos_x>52.0</pos_x>
      <pos_y>32.4</pos_y>
    </instance>
  <ROWS>
    <row>
      <code>Start</code>
      <R>0</R>
      <G>0</G>
      <B>0</B>
    </row>
    <row>
      <code>Rachel Sparrow</code>
      <sort_order>1</sort_order>
      <R>51400</R>
      <G>51400</G>
      <B>51400</B>
    </row>
    <row>
      <code>Taylor Heard</code>
      <sort_order>2</sort_order>
      <R>51400</R>
      <G>51400</G>
      <B>51400</B>
    </row>
  </ROWS>
</file>

1 Ответ

0 голосов
/ 05 мая 2020

После целого дня исследований и испытаний я наконец собрал решение, которое работает. Мне удалось получить все вложенные / повторные данные из «текстового» узла с помощью:

nested_data <- xml_text(xml_nodes(myxml,"text"))

Поскольку всегда было 3 «текстовых» поля в одном и том же порядке, я смог получить каждую третью запись с помощью:

team <- nested_data[seq(1,length(nested_data),3)]
action <- nested_data[seq(2,length(nested_data),3)]
half <- nested_data[seq(3,length(nested_data),3)]

Полный код для тех, кто находится в похожей лодке ...

library(rvest)
myxml <- read_xml("test_001.xml")
player <- xml_text(xml_nodes(myxml,"code")) #these don't repeat so are easy to grab and use
id <- xml_text(xml_nodes(myxml,"ID"))
time <- xml_text(xml_nodes(myxml,"start"))
nested_data <- xml_text(xml_nodes(myxml,"text")) #"text" is the actual data I want
team <- nested_data[seq(1,length(nested_data),3)] #grab every 3rd entry, starting at 1 position
action <- nested_data[seq(2,length(nested_data),3)] #grab every 3rd entry, starting at 2 position
half <- nested_data[seq(3,length(nested_data),3)] #grab every 3rd entry, starting at 3 position
pos_x <- xml_text(xml_nodes(myxml,"pos_x"))
pos_y <- xml_text(xml_nodes(myxml,"pos_y"))
df <- data.frame(id,time, half, team, player, action, pos_x, pos_y ) #final dataframe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...