Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 需要什么才能得到“的”呢;“抒情艺术家”;使用Nokogiri从这个XML提要?_Ruby_Xml_Xpath_Nokogiri - Fatal编程技术网

Ruby 需要什么才能得到“的”呢;“抒情艺术家”;使用Nokogiri从这个XML提要?

Ruby 需要什么才能得到“的”呢;“抒情艺术家”;使用Nokogiri从这个XML提要?,ruby,xml,xpath,nokogiri,Ruby,Xml,Xpath,Nokogiri,首先是xml: 成功将抓取文档内容 在这一点上,我无法进入和抓取数据,我不知道为什么 例如,我希望: doc.xpath("//LyricArtist") 要回敬这位艺术家,但事实并非如此 我在其他提要上也尝试过同样的方法,例如任何wordpress安装提供的默认RSS提要,如果我执行以下操作: doc.xpath("//link") 我得到了所有“链接”的列表 我肯定遗漏了一些东西,希望您能提供帮助。谢谢 它不喜欢名称空间或模式中的某些内容 uri = "http://api.chart

首先是xml:

成功将抓取文档内容

在这一点上,我无法进入和抓取数据,我不知道为什么

例如,我希望:

doc.xpath("//LyricArtist")
要回敬这位艺术家,但事实并非如此

我在其他提要上也尝试过同样的方法,例如任何wordpress安装提供的默认RSS提要,如果我执行以下操作:

doc.xpath("//link")
我得到了所有“链接”的列表


我肯定遗漏了一些东西,希望您能提供帮助。谢谢

它不喜欢名称空间或模式中的某些内容

uri = "http://api.chartlyrics.com/apiv1.asmx//GetLyric?LyricId=90&lyricCheckSum=9600c891e35f602eb6e1605fb7b5229e"
x = open(uri).read()
x = x.sub(/<.*?>/,'').sub(/<.*?>/,'<GetLyricResult>')
doc = Nokogiri::XML(x)
puts doc.xpath('//LyricArtist').text()
uri=”http://api.chartlyrics.com/apiv1.asmx//GetLyric?LyricId=90&lyricCheckSum=9600c891e35f602eb6e1605fb7b5229e"
x=打开(uri).read()
x=x.sub(//,'').sub(//,'')
doc=Nokogiri::XML(x)
放置doc.xpath('//LyricArtist').text()

它不喜欢名称空间或架构中的某些内容

uri = "http://api.chartlyrics.com/apiv1.asmx//GetLyric?LyricId=90&lyricCheckSum=9600c891e35f602eb6e1605fb7b5229e"
x = open(uri).read()
x = x.sub(/<.*?>/,'').sub(/<.*?>/,'<GetLyricResult>')
doc = Nokogiri::XML(x)
puts doc.xpath('//LyricArtist').text()
uri=”http://api.chartlyrics.com/apiv1.asmx//GetLyric?LyricId=90&lyricCheckSum=9600c891e35f602eb6e1605fb7b5229e"
x=打开(uri).read()
x=x.sub(//,'').sub(//,'')
doc=Nokogiri::XML(x)
放置doc.xpath('//LyricArtist').text()

XML元素是命名空间限定的,并绑定到
http://api.chartlyrics.com/

如果查看XML,您会注意到document元素有一个名称空间标记:

<GetLyricResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://api.chartlyrics.com/">
如果您希望更精确,可以使用
local-name()
来匹配元素名称,并使用
namespace-uri()
来匹配声明的名称空间

//*[local-name()='LyricArtist']
//*[local-name()='LyricArtist' and namespace-uri()='http://api.chartlyrics.com/']

第二个示例将阻止对绑定到不同名称空间的具有相同
local-name()
的元素进行匹配。对于这个特定的实例来说可能不是问题,但是您应该注意这一点。名称空间用于唯一地限定节点,并允许不同的词汇表对某些内容使用相同的“名称”,而不必担心冲突。

XML元素是名称空间限定的,并绑定到
http://api.chartlyrics.com/

如果查看XML,您会注意到document元素有一个名称空间标记:

<GetLyricResult xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://api.chartlyrics.com/">
如果您希望更精确,可以使用
local-name()
来匹配元素名称,并使用
namespace-uri()
来匹配声明的名称空间

//*[local-name()='LyricArtist']
//*[local-name()='LyricArtist' and namespace-uri()='http://api.chartlyrics.com/']

第二个示例将阻止对绑定到不同名称空间的具有相同
local-name()
的元素进行匹配。对于这个特定的实例来说可能不是问题,但是您应该注意这一点。名称空间用于唯一地限定节点,并允许不同的词汇表对某些内容使用相同的“名称”,而无需担心冲突。

Mads,非常感谢您花时间向我解释这一点。我现在有家庭作业,需要仔细阅读XML/名称空间,因为我觉得这对我来说应该是显而易见的,但事实并非如此。不过,我还有一个问题;Nokogiri能胜任我在这里的工作吗?根据我的研究,我发现Nokogiri比大多数其他库(特定于XML解析)都要快,而且我在很大程度上喜欢这种语法。还有其他建议吗?Mads,我发现这也行:doc.xpath('//xmlns:LyricArtist')原因如下:检查“奖金回合”。Mads,再次感谢您,如果“奖金回合”语法有效,请继续。它的语法更短,更容易编写。只要您了解什么是名称空间以及名称空间前缀是如何工作的,那么您就可以准备好什么时候可能会有问题以及如何处理它。Mads,非常感谢您花时间向我解释这一点。我现在有家庭作业,需要仔细阅读XML/名称空间,因为我觉得这对我来说应该是显而易见的,但事实并非如此。不过,我还有一个问题;Nokogiri能胜任我在这里的工作吗?根据我的研究,我发现Nokogiri比大多数其他库(特定于XML解析)都要快,而且我在很大程度上喜欢这种语法。还有其他建议吗?Mads,我发现这也行:doc.xpath('//xmlns:LyricArtist')原因如下:检查“奖金回合”。Mads,再次感谢您,如果“奖金回合”语法有效,请继续。它的语法更短,更容易编写。只要您了解什么是名称空间以及名称空间前缀是如何工作的,那么您就准备好了什么时候它可能会起作用以及如何处理它。