2010-05-24 61 views
0
使用XPath

我使用引入nokogiri解析来自Rackspace的API 一回,所以我使用他们的示例代码引入nokogiri解析Rails中

response = server.get '/customers/'[email protected]_id.to_s+'/domains/', server.xml_format 
    doc = Nokogiri::XML::parse response.body 
    puts "xpath values" 
    doc.xpath("//name").each do |node| 
    puts 
    node.text 
    end 

至于我的代码使用引入nokogiri返回Rackspace公司回报节点的元素节点列表

由于某种原因,我似乎错过了一些明显的东西,我只是为了我的生活无法得到它来解析节点列表并将它们还给我,有没有简单的我可以做的事情修复它以返回节点列表?

这里的XML我试图解析的例子:

<domainList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:xml:domainList"> 
    <offset>0</offset> 
    <size>50</size> 
    <total>4</total> 
    <domains> 
    <domain> 
     <name>domain1.com</name> 
     <accountNumber>xxxxxxx</accountNumber> 
     <serviceType>exchange</serviceType> 
    </domain> 
    <domain> 
     <name>domain2.com</name> 
     <accountNumber>xxxxxxx</accountNumber> 
     <serviceType>exchange</serviceType> 
    </domain> 
    <domain> 
     <name>domain3.com</name> 
     <accountNumber>xxxxxxx</accountNumber> 
     <serviceType>exchange</serviceType> 
    </domain> 
    </domains> 
</domainList> 

干杯

+1

你可以发布一个XML数据的例子出现在你的响应变量? – tommasop 2010-05-24 07:27:28

+0

我已经添加了一个我试图解析的XML类型的例子 – Schroedinger 2010-05-24 07:52:08

回答

2

这个问题似乎是,你要告诉引入nokogiri他们的命名空间。

如果您从domainLists标记中删除xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:xml:domainList",您会看到您的查询工作。

否则,您需要告诉Nokogiri该名称空间。

doc.xpath("//blarg:name", {'blarg' => 'urn:xml:domainList'}).each do |name| 
    puts name.text 
end 

Nokogiri xpath接受第二个参数,它是名称空间的散列。你有xml定义了一个通用名称空间,但没有给它一个标签。我不知道nokogiri是否有办法找到它,所以在搜索时只需要给你的搜索一个任意的标签,并将命名空间路径与该标签相关联。你可以放任何你想要的文字而不是blarg,这仅仅是一个例子。

+0

你是一个绝对的救星,谢谢! – Schroedinger 2010-05-24 21:52:43