解析xmlToList中的CDATA字段

时间:2014-01-25 20:33:04

标签: xml r cdata

我遇到了xmlToList,特别是API响应中的几个CDATA字段。

我正在使用返回XML或JSON的API。我正在使用XML::xmlToList将XML格式的API响应转换为列表结构,并使用 RJSONIO fromJSON来执行与JSON格式相同的操作。

fromJSON输出正是我想要的,但我希望能够从XML响应中获得相同的结构。

主要问题是xmlToList似乎放弃了字段的内容,如果它们位于CDATA包装内。

以下是API的示例网址(XML格式): http://www.colourlovers.com/api/color/6B4106

这是JSON中的一个:http://www.colourlovers.com/api/color/6B4106?format=json

正如您在第一个链接中看到的,有几个字段的值存储在CDATA中,例如title

<title>
<![CDATA[ wet dirt ]]>
</title>

如果我用fromJSON解析此问题,我会得到以下结果:

List of 17
 $ id         : num 903893
 $ title      : chr "wet dirt"
 $ userName   : chr "jessicabrown"
 $ numViews   : num 323
 $ numVotes   : num 1
 $ numComments: num 0
 $ numHearts  : num 0
 $ rank       : num 0
 $ dateCreated: chr "2008-03-17 11:22:21"
 $ hex        : chr "6B4106"
 $ rgb        :List of 3
  ..$ red  : num 107
  ..$ green: num 65
  ..$ blue : num 6
 $ hsv        :List of 3
  ..$ hue       : num 35
  ..$ saturation: num 94
  ..$ value     : num 42
 $ description: chr ""
 $ url        : chr "http://www.colourlovers.com/color/6B4106/wet_dirt"
 $ imageUrl   : chr "http://www.colourlovers.com/img/6B4106/100/100/wet_dirt.png"
 $ badgeUrl   : chr "http://www.colourlovers.com/images/badges/c/903/903893_wet_dirt.png"
 $ apiUrl     : chr "http://www.colourlovers.com/api/color/6B4106"

根据需要,title字段只是一个字符串。但是使用xmlToList,我得到:

List of 17
 $ id         : chr "903893"
 $ title      :List of 1
  ..$ : NULL
 $ userName   :List of 1
  ..$ : NULL
 $ numViews   : chr "323"
 $ numVotes   : chr "1"
 $ numComments: chr "0"
 $ numHearts  : chr "0"
 $ rank       : chr "0"
 $ dateCreated: chr "2008-03-17 11:22:21"
 $ hex        : chr "6B4106"
 $ rgb        :List of 3
  ..$ red  : chr "107"
  ..$ green: chr "65"
  ..$ blue : chr "6"
 $ hsv        :List of 3
  ..$ hue       : chr "35"
  ..$ saturation: chr "94"
  ..$ value     : chr "42"
 $ description:List of 1
  ..$ : NULL
 $ url        :List of 1
  ..$ : NULL
 $ imageUrl   :List of 1
  ..$ : NULL
 $ badgeUrl   :List of 1
  ..$ : NULL
 $ apiUrl     : chr "http://www.colourlovers.com/api/color/6B4106"

我没有像我期望的那样返回<![CDATA[ wet dirt ]]>wet dirt,而只是获得一个包含NULL内容的单元素列表。如何让xmlToList处理CDATA元素?

以下是代码:

xmlurl <- url('http://www.colourlovers.com/api/color/6B4106')
response1 <- paste(readLines(xmlurl, warn=FALSE), collapse='')
close(xmlurl)

jsonurl <- url('http://www.colourlovers.com/api/color/6B4106?format=json')
response2 <- paste(readLines(jsonurl, warn=FALSE), collapse='')
close(jsonurl)

str(XML::xmlToList(response1))
str(RJSONIO::fromJSON(response2))

1 个答案:

答案 0 :(得分:3)

查看XML:::parserOptions

使用

test <- xmlParse("http://www.colourlovers.com/api/color/6B4106", options = NOCDATA)
res <- xmlToList(test)

> res$color$title
[1] "wet dirt"
>