从oracle表列读取xml数据并在R中解析它

时间:2018-03-06 11:14:02

标签: r xml

我在R中有一个场景 我已将oracle数据库与R通过RODBC包连接,并在表的一列中有xml数据。现在,当我使用xmlParse函数时,它显示错误,因为XML内容似乎不是XML。和class(xmldata)是数据框。

当我复制xml数据并将其放入新的xml文件并通过xmlParse函数进行解析时,它正确解析并将类(sourcefile)解析为XMLInternalDocument。

1 个答案:

答案 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)