0

以下のサンプル構造の XML ファイルからデータを抽出しようとしています。

<pwx creator="PerfPRO" version="1.0">
<workout>
<athlete></athlete>
<title></title>
<sportType>Bike</sportType>
<cmt></cmt>
<device id=""></device>
<time>2016-01-19T08:01:00</time>
<summarydata>
    <beginning>0</beginning>
    <duration>3600.012</duration>
</summarydata>
<segment>
    <summarydata>
        <beginning>0</beginning>
        <duration>120</duration>
    </summarydata>
</segment>
<segment>
    <summarydata>
        <beginning>120</beginning>
        <duration>120</duration>
    </summarydata>
</segment>
<segment>
    <summarydata>
        <beginning>240</beginning>
        <duration>120</duration>
    </summarydata>
</segment>

「セグメント」ブロック (開始と期間の両方) のデータに、理想的にはデータ フレームとしてアクセスしたいと考えています。多数のセグメント ブロックがあります。

私は多くのことを試しましたが、まだそれを抽出できないようです。取得できるのは空のリストだけです。これが私が行ったことです(pwxはファイル名です):

xmlData <- xmlInternalTreeParse(pwx, useInternalNodes = TRUE)
xmltop = xmlRoot(XMLdata)

d <- xpathSApply(doc = xmlData, path = "//pwx/workout/segment/summarydata/beginning", fun = xmlValue)

また、次の方法ですべてのセグメントにアクセスできるようです。

segment <- xmltop[[1]]["segment"]

しかし、値を取得できないようです。上記のさまざまなバリエーションを試しました。

どんな助けでも大歓迎です、ありがとう。

編集:

> summary(xmlData)
$nameCounts

    cad        dist          hr         pwr      sample         spd  timeoffset   beginning 
   3274        3274        3274        3274        3274        3274        3274          16 


duration summarydata     segment     athlete         cmt      device        make       model 
         16          16          15           1           1           1           1           1 
       name         pwx   sportType        time       title     workout 
          1           1           1           1           1           1 

$numNodes
[1] 22992
4

3 に答える 3

5

xml2これは、少しpurrr投入された生の処理です。

library(xml2)
library(purrr)

nodes <- xml_find_all(doc, ".//segment/summarydata")

map_df(nodes, function(x) {
  kids <- xml_children(x)
  setNames(as.list(type.convert(xml_text(kids))), xml_name(kids))
})

## Source: local data frame [3 x 2]
## 
##   beginning duration
##       (int)    (int)
## 1         0      120
## 2       120      120
## 3       240      120
于 2016-01-30T20:21:57.153 に答える
3

チェックアウトする必要がありrvestます。以下は、最もエレガントな使用方法ではないかもしれませんが、機能します。

some_xml <- paste0(your_xml,'</workout></pwx>') # your example plus end of data to complete

library('rvest')
some_xml %>% read_xml %>% xml_nodes('summarydata')  -> nodes
nodes %>% xml_nodes('beginning') %>% xml_text -> beginning
nodes %>% xml_nodes('duration') %>% xml_text -> duration
data.frame(beginning, duration, stringsAsFactors = FALSE)
#   beginning duration
# 1         0 3600.012
# 2         0      120
# 3       120      120
# 4       240      120
于 2016-01-30T18:36:18.193 に答える