代码之家  ›  专栏  ›  技术社区  ›  Schroedinger

nokogiri解析rackspace返回,在rails中使用xpath

  •  0
  • Schroedinger  · 技术社区  · 14 年前

    我正在使用Nokogiri分析Rackspace API的返回 所以我用他们的示例代码

       response = server.get '/customers/'+@user.customer_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返回元素节点列表的代码

    出于某种原因,我似乎错过了一些明显的东西,我只是在我的生命中无法让它解析节点列表并将它们返回给我,是否有一些简单的方法可以修复,让它返回节点列表?

    下面是我试图分析的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 回复  |  直到 14 年前
        1
  •  2
  •   Beanish    14 年前

    问题似乎是你必须告诉Nokogiri他们的名称空间。

    如果删除 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接受第二个参数,它是名称空间的散列。您已经定义了一个通用名称空间,但没有给它一个标记。我不知道Nokogiri是否可以找到它,所以在搜索时,只需给搜索一个任意的标记,并将名称空间路径与该标记相关联。你可以放任何你想要的文本,而不是blarg,它只是举个例子。