【发布时间】:2020-05-03 16:14:32
【问题描述】:
我正在尝试从我当前的数据中解析/读取多个 xml 文件并尝试将它们组合在一起。
而我的示例 xml 文件是这样的:
<ApplicationResponse>
<Service Name="AlternativeCreditAttributes">
<Categories>
<Category Name="Default">
<Attributes>
<Attribute Name="ACA_ACH_NSF_12M" Value="0" />
<Attribute Name="ACA_ACH_NSF_18M" Value="0" />
<Attribute Name="ACA_ACH_NSF_24M" Value="0" />
<Attribute Name="ACA_ACH_NSF_3M" Value="0" />
<Attribute Name="ACA_ACH_NSF_6M" Value="0" />
<Attribute Name="ACA_ACH_NSF_9M" Value="0" />
<Attribute Name="ACA_ACH_NSF_AMT_12M" Value="" />
<Attribute Name="ACA_ACH_NSF_AMT_18M" Value="" />
<Attribute Name="ACA_ACH_NSF_AMT_24M" Value="" />
<Attribute Name="ACA_ACH_NSF_AMT_3M" Value="" />
<Attribute Name="ACA_ACH_NSF_AMT_6M" Value="" />
<Attribute Name="ACA_ACH_NSF_AMT_9M" Value="" />
<Attribute Name="ACA_ACH_NSF_AMT_EVER" Value="600" />
<Attribute Name="ACA_ACH_NSF_EVER" Value="2" />
<Attribute Name="ACA_ACH_NSF_MONTHS_SINCE_NEWEST" Value="41" />
<Attribute Name="ACA_ACH_NSF_MONTHS_SINCE_OLDEST" Value="41" />
</Attributes>
</Category>
</Categories>
</Service>
</ApplicationResponse>
我已经根据以下代码成功拉取了一个文件:
doc<-read_xml(Data$XMLResponse[1])
# setNames(data.frame(
cols<- xml_attr(xml_find_all(doc, "//Attribute"), "Name")
rows<- xml_attr(xml_find_all(doc, "//Attribute"), "Value")
# ),
out <- data.frame(rows, row.names = cols)
out
但是当我尝试使用lapply 来基于这个answer 提取多个文件时,我遇到了工作目录上的错误。
错误:当前工作目录中不存在“NA”
以下是我使用的代码。如果您知道该问题或需要有关此问题的任何详细信息,请告诉我。提前致谢。
df_list <- lapply(Data$XMLResponse, function(f) {
doc <- read_xml(f)
setNames(data.frame(
xml_attr(xml_find_all(doc, "//Attribute"), "Name"),
xml_attr(xml_find_all(doc, "//Attribute"), "Value")
),c("Name", f))
})
【问题讨论】:
-
如果您在使用 lapply 时遇到问题,您可以通过查看为什么尝试将相同的代码作为循环运行的原因来更轻松地解决问题。首先创建一个空列表,将 doc 变量存储在列表的每个索引处,然后如果循环抛出错误,请检查新列表的大小。通常,您会发现您正在处理的向量的元素之一会产生意想不到的结果。
-
谢谢@AllanCameron。创建一个空列表帮助我找到循环停止的位置。这可能是因为文件中的非法xml字符。
标签: r xml lapply working-directory