转换为数据框时的 xml2 命名空间/xpath 问题

xml2 namespace / xpath issue when converting to dataframe

我正在尝试使用 xml2.

将 xml 文档转换为平面数据框

下面是一些示例代码,删除了架构部分。我正在尝试提取所有“事件”节点:

library(xml2)

test_xml <- as_xml_document(
'<Root>
  <xs:schema xmlns="address.com" xmlns:mstns="address.com" id="id">
  </xs:schema>
    <NewDataSet xmlns="address.com">
      <Events>
        <VAR1>3119496</VAR1>
        <VAR2>3119496</VAR2>
        <VAR3>text</VAR3>
      </Events>
      <Events>
        <VAR1>3119496</VAR1>
        <VAR2>3119496</VAR2>
        <VAR3>text</VAR3>
      </Events>
    </NewDataSet>
</Root>'
)

这是我使用 RStudio 时的图片 read_xml("file_path") %>% View():

基于 我希望像下面这样的东西可以工作...

xml_df <- test_xml %>%
    xml_child(2) %>%
    xml_find_all("//Events") %>% 
    map_df(~ { xml_attrs(.x) %>% as.list() } ) 

...但事实并非如此。我的猜测是问题出在 xml_find_all 中的 xpath,但我不确定。任何帮助将不胜感激!

编辑:鉴于第一个答案不起作用(在我添加命名空间之前),我猜测新示例中的命名空间导致了问题。

也许您正在寻找这样的东西:

test_xml %>% 
  xml_find_all(xpath = "//Events") %>% 
  as_list() %>% 
  lapply(function(x) as.data.frame(t(unlist(x)))) %>% 
  {do.call(rbind, .)}

#>      VAR1    VAR2
#> 1 3119496 3119496
#> 2 3119496 3119496

对于以后遇到这个问题的人来说,上面的问题是因为 xml.

中的命名空间

将上面 Allan 的回答与 相结合,我只需要使用 xml_ns_strip() 或下面的代码将我的 xml 变成数据框。

xml_df <- test_xml %>%
  xml_find_all(xpath = "//d1:Events", xml_ns(.)) %>%
  as_list() %>%
  map_df(~ unlist(.))