R将复杂xml转换为数据帧

时间:2016-11-17 12:17:13

标签: r xml dataframe xml-parsing

我正在将复杂的XML文件转换为数据帧。

这种方法存在两个问题:

  1. 所有两个都被复制到应该为空的地方
  2. 如果其中一个节点中有更多数据点,则有时会出现此错误:"参数意味着行数不同:198,240"它应该映射回同一行,如果它没有& #39; t存在,应为null。
  3. 如何计算两个现有列等于3?
  4. 这是它的简化版本:

    require(xml2)
    
    xml_data = "
    <top>
        <line>
            <one>1</one>
        </line>
        <line>
            <one>1</one>
            <two>2</two>
        </line>
        <line>
            <one>1</one>
        </line>
    </top>
    "
    
    data2 <- read_xml(file)
    
    
    df <- data.frame(
      #purchase
      one=xml_text(xml_find_all(data2, ".//line/one")),
      two=xml_text(xml_find_all(data2, ".//line/two")),
      sum1 = one + two
    )
    

1 个答案:

答案 0 :(得分:2)

在我写完评论后,我意识到实际的搜索努力是不可能的:

require(xml2)
library(purrr)
library(dplyr)

xml_data = "
<top>
    <line>
        <one>1</one>
    </line>
    <line>
        <one>1</one>
        <two>2</two>
    </line>
    <line>
        <one>1</one>
    </line>
</top>
"

data2 <- read_xml(xml_data)

xml_find_all(data2, ".//line") %>% 
  map_df(function(x) {
    one <- xml_find_all(x, ".//one") %>% xml_text() %>% as.numeric()
    two <- xml_find_all(x, ".//two") %>% xml_text() %>% as.numeric()
    if (length(two) == 0) two <- NA_integer_
    data_frame(one, two, sum=sum(one, two, na.rm=TRUE))
  })
## # A tibble: 3 × 3
##     one   two   sum
##   <dbl> <dbl> <dbl>
## 1     1    NA     1
## 2     1     2     3
## 3     1    NA     1