转换为数据框时的 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(.))
我正在尝试使用 xml2
.
下面是一些示例代码,删除了架构部分。我正在尝试提取所有“事件”节点:
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(.))