我有155个xml文件作为数据帧导入到R中。我对xml知之甚少,并且无法获取节点。
我想编写一个函数来获取“d2p1:KeyValueOfintEpisodesmiwmOyvC”中的所有数据
这是我的R代码:
library(XML)
xml_to_df<-function(xmlfile){
results <- xmlParse(xmlfile)
df <- xmlToDataFrame(nodes = getNodeSet(results, "//CardEpisodes/d2p1:KeyValueOfintEpisodesmiwmOyvC"))
return(df)
}
my_files<-list.files(pattern="\\.xml$")
my_data<-lapply(my_files,xml_to_df)
new_df<-bind_rows(my_data)
此代码应该能够将我的工作目录中的所有xml文件组合在一起并将它们放入一个数据帧中。
我得到的错误是:
XPath错误:未定义的名称空间前缀 XPath错误:Invalidexpression
我认为我的错误应该在这一行:
df <- xmlToDataFrame(nodes = getNodeSet(results, "//CardEpisodes/d2p1:KeyValueOfintEpisodesmiwmOyvC"))
我该如何设置节点?
非常感谢您的帮助!
[编辑]
<?xml version="1.0"?>
<CPRCard xmlns="http://schemas.datacontract.org/2004/07/CPRcardViewer" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" z:Id="i1" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<CardEpisodes xmlns:d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<d2p1:KeyValueOfintEpisodesmiwmOyvC>
<d2p1:Key>0</d2p1:Key>
<d2p1:Value>
<AdqDepth>4</AdqDepth>
<AdqRate>64</AdqRate>
<AvgDepth>39</AvgDepth>
<card z:Ref="i1"/>
</d2p1:Value>
</d2p1:KeyValueOfintEpisodesmiwmOyvC>
<d2p1:KeyValueOfintEpisodesmiwmOyvC>
<d2p1:Key>1</d2p1:Key>
<d2p1:Value>
<AdqDepth>17</AdqDepth>
<AdqRate>28</AdqRate>
<AvgDepth>45</AvgDepth>
<card z:Ref="i1"/>
</d2p1:Value>
</d2p1:KeyValueOfintEpisodesmiwmOyvC>
</CardEpisodes>
</CPRCard>
您缺少的是名称空间定义,我不是专家,但错误是“我不知道d2p1
的意思”。为了避免这种情况,你必须在namespaces
调用中添加一个getNodeSet
参数:
getNodeSet(x, "//d2p1:KeyValueOfintEpisodesmiwmOyvC",
namespaces = c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays"))
我找到了完整的xml中指定的命名空间。
无论如何将此插入xmlToDataFrame
函数将导致问题,因为节点的第一级仅由Key
和Value
字段组成。然后Value
字段包含3个数据点。
xmlToDataFrame(nodes = getNodeSet(x,
"//d2p1:KeyValueOfintEpisodesmiwmOyvC",
c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays")))
# Key Value
# 1 0 46439
# 2 1 172845
为了避免这种情况,我们必须进行两个不同的调用,一个用于检索3个值,另一个用于键:
values <- xmlToDataFrame(nodes = getNodeSet(x,
"//d2p1:KeyValueOfintEpisodesmiwmOyvC/d2p1:Value",
c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays")))
keys <- xmlToDataFrame(nodes = getNodeSet(x,
"//d2p1:KeyValueOfintEpisodesmiwmOyvC",
c(d2p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays")))
# Bind and clean
result <- data.frame(Key = keys[, 1], values[, 1:3])
希望这可以帮助