解析 xmlToList 中的 CDATA 字段



我在xmlToList时遇到问题,特别是 API 响应中的几个 CDATA 字段。

我正在使用一个返回XML或JSON的API。我正在使用XML::xmlToList将XML格式的API响应转换为列表结构,RJSONIOfromJSON对JSON格式执行相同的操作。

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

主要问题是,如果字段位于CDATA包装器内,xmlToList似乎会丢弃字段的内容。

下面是 API 的示例 URL(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))

看看XML:::parserOptions

test <- xmlParse("http://www.colourlovers.com/api/color/6B4106", options = NOCDATA)
res <- xmlToList(test)
> res$color$title
[1] "wet dirt"
>

最新更新