我在R中有一个场景 我已将oracle数据库与R通过RODBC包连接,并在表的一列中有xml数据。现在,当我使用xmlParse函数时,它显示错误,因为XML内容似乎不是XML。和class(xmldata)是数据框。
当我复制xml数据并将其放入新的xml文件并通过xmlParse函数进行解析时,它正确解析并将类(sourcefile)解析为XMLInternalDocument。
答案 0 :(得分:0)
引发错误的原因是您在数据框对象上运行XML::xmlParse
,该对象是RODBC::sqlQuery()
的返回值,而不是基础XML内容。只需索引特定XML内容的列和行值即可。
例如,下面将XML(R标记中排名前5位的StackOverflow用户)读入数据框并运行xmlParse
以重现错误,并运行另一个xmlParse
调用以解决错误。
Dataframe Build (复制sqlQuery)
txt <- '<?xml version="1.0"?>
<stackoverflow>
<group lang="r">
<topusers>
<user>akrun</user>
<link>https://stackoverflow.com/users/3732271/akrun</link>
<location>Bengaluru, Karnataka, India</location>
<year_rep>15,900</year_rep>
<total_rep>328,573</total_rep>
<tag1>r</tag1>
<tag2>dataframe</tag2>
<tag3>dplyr</tag3>
</topusers>
<topusers>
<user>Dirk Eddelbuettel</user>
<link>https://stackoverflow.com/users/143305/dirk-eddelbuettel</link>
<location>Chicago, IL, United States </location>
<year_rep>5,588</year_rep>
<total_rep>253,481</total_rep>
<tag1>r</tag1>
<tag2>rcpp</tag2>
<tag3>c++</tag3>
</topusers>
<topusers>
<user>42-</user>
<link>https://stackoverflow.com/users/1855677/42</link>
<location>Alameda, CA</location>
<year_rep>4,143</year_rep>
<total_rep>193,407</total_rep>
<tag1>r</tag1>
<tag2>dataframe</tag2>
<tag3>plot</tag3>
</topusers>
<topusers>
<user>A5C1D2H2I1M1N2O1R2T1</user>
<link>https://stackoverflow.com/users/1270695/a5c1d2h2i1m1n2o1r2t1</link>
<location>Chennai, India</location>
<year_rep>3,982</year_rep>
<total_rep>141,425</total_rep>
<tag1>r</tag1>
<tag2>dataframe</tag2>
<tag3>reshape</tag3>
</topusers>
<topusers>
<user>Gavin Simpson</user>
<link>https://stackoverflow.com/users/429846/gavin-simpson</link>
<location>Regina, Canada </location>
<year_rep>2,780</year_rep>
<total_rep>124,779</total_rep>
<tag1>r</tag1>
<tag2>plot</tag2>
<tag3>dataframe</tag3>
</topusers>
</group>
</stackoverflow>'
res <- data.frame(Col1 = txt)
错误行
result1 <- xmlParse(res, asText=TRUE)
# Error: XML content does not seem to be XML: '1'
已解决的行 (不会产生任何错误)
# SINGLE XML
result1 <- xmlParse(res$Col1[[1]], asText=TRUE)
# MULTIPLE XML (ACROSS ALL ROWS)
result_list <- lapply(res$Col1, xmlParse, asText=TRUE)