我遇到了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))
答案 0 :(得分:3)
查看XML:::parserOptions
使用
test <- xmlParse("http://www.colourlovers.com/api/color/6B4106", options = NOCDATA)
res <- xmlToList(test)
> res$color$title
[1] "wet dirt"
>