【问题标题】:use getnodeset to get node value使用 getnodeset 获取节点值
【发布时间】:2015-10-21 08:06:29
【问题描述】:

我是 R 新手,我想使用 R 从网站获取一些数据。 我试图从 Yahoo API 获取一些城市索引和城市名称,因此我需要解析一个 XML 文件。 但是当我尝试使用getNodeSet() 函数获取某些节点的值时,R 返回一个空列表。 我们的专家能否就此类问题给我一些建议? 非常感谢!

雅虎链接:Yahoo weather API

我已经更新了 XML 文件。

<query xmlns:yahoo="http://www.yahooapis.com/v1/base.rng" yahoo:count="346" yahoo:created="2015-07-30T02:48:20Z" yahoo:lang="zh-CN">
<diagnostics>
<publiclyCallable>true</publiclyCallable>
<url execution-start-time="24" execution-stop-time="114" execution-time="90">
<![CDATA[
http://wws.geotech.yahooapis.com/v1/counties/CN;start=0;count=1000
]]>
</url>
<user-time>121</user-time>
<service-time>90</service-time>
<build-version>0.2.154</build-version>
</diagnostics>
<results>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198131">
<woeid>26198131</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Wuwei</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198056">
<woeid>26198056</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Jinchang</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198129">
<woeid>26198129</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Lanzhou</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198130">
<woeid>26198130</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Baiyin</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198128">
<woeid>26198128</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Linxia Huizu</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198133">
<woeid>26198133</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Zhangye</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198127">
<woeid>26198127</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Dingxi</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198125">
<woeid>26198125</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Gannan Zangzu</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198042">
<woeid>26198042</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Ili Kazakh</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198043">
<woeid>26198043</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Kizilsu Kirghiz</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198047">
<woeid>26198047</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Aletai</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198049">
<woeid>26198049</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Hetian</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198262">
<woeid>26198262</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Jiamusi</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198263">
<woeid>26198263</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Shuangyashan</name>
</place>
<place xmlns="http://where.yahooapis.com/v1/schema.rng" xml:lang="en-US" yahoo:uri="http://where.yahooapis.com/v1/place/26198057">
<woeid>26198057</woeid>
<placeTypeName code="9">Prefecture</placeTypeName>
<name>Daxing'anling</name>
</place>
</results>
</query>
<!--  total: 121  -->
<!--  pprd1-node1004-lh1.manhattan.ne1.yahoo.com  -->

我用这段代码试过了:

> library(XML)
> temp = xmlTreeParse("yql.xml",useInternalNodes = TRUE)
> woeid = getNodeSet(temp,"//woeid")
> woeid

但它的回报是:

> list()
attr(,"class")
[1] "XMLNodeSet"

【问题讨论】:

  • 我无法解析您的示例。请确保xmlTreeParse 代码适用于示例。
  • 抱歉,Richard,示例只是原始 xml 文件的一部分。我将更新示例:)
  • @RichardScriven 嗨理查德,更新了:)

标签: xml r xpath


【解决方案1】:

woeid 继承父 place 元素的默认命名空间。要使用 XPath 引用命名空间中的元素,您需要先映射一个前缀以指向相应的命名空间 uri,然后在 XPath 中正确使用该前缀。

我不经常使用 用户,但一些在线资源引导我这样做:

getNodeSet(temp, "//d:woeid", c(d="http://where.yahooapis.com/v1/schema.rng"))

【讨论】:

  • 我的代码中唯一的区别是我在c("d" = ...) 上加上了引号,但这不应该有所作为。我在上一行使用了xmlTreeParse("http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20geo.counties%20where%20place%3D%22CN%22&amp;diagnostics=true", useInternal = TRUE)
  • @RichardScriven 好的,我会再次测试这个。我会在测试中通知你。非常感谢!
  • 你好 Richard 和 @har07 我再次尝试使用 XML 文件但我没有得到节点的值 :( 但是如果我解析其他 XML 文件,函数 getNodeSet() 可以正常工作。 . 有点奇怪...
  • @Lisen 我的本地机器上没有r 来测试。是否可以从字符串而不是文件中使用xmlTreeParse()? (我正在寻找测试r-fiddle.org 中代码的可能性)
  • @har07 该函数似乎只接收一个xml文件作为参数。我还测试了链接中的 xPath:link。我测试//woeid,它返回不匹配。但是如果我测试//query(xml根),它可以返回内容......那么节点WOEID的xPath值不正确吗?
猜你喜欢
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 2013-12-20
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多