如何使用Nokogiri

时间:2016-08-08 16:36:03

标签: ruby xml nokogiri

鉴于以下XML,我想为Name="Cat"获取值“0123456”:

xml.xpath '//Custom[Name="Cat"]'

给我第一个自定义,这是正确的,但我只想要“值”而不是整个自定义节点。

<body>
  <Custom>
    <count>1</count>
    <Name>Cat</Name>
    <Value>0123456</Value>
  </Custom>
  <Custom>
    <count>2</count>
    <Name>Dog</Name>
    <Value>9876543</Value>
  </Custom>
<body>

3 个答案:

答案 0 :(得分:2)

  

我只想要&#34;价值&#34;不是整个自定义节点。

所以继续写下这条路:

ID  Name    State
1   John    nan
1   John    nan
2   Smith   NE
3   Janet   nan
3   Janet   nan
3   Janet   nan

答案 1 :(得分:1)

为了便于阅读,我更喜欢在XPath上使用CSS选择器,因为CSS通常包含较少的视觉噪音:

要求&#39; nokogiri&#39;

doc = Nokogiri::HTML(<<EOT)
<body>
  <Custom>
    <count>1</count>
    <Name>Cat</Name>
    <Value>0123456</Value>
  </Custom>
  <Custom>
    <count>2</count>
    <Name>Dog</Name>
    <Value>9876543</Value>
  </Custom>
<body>
EOT

foo = doc.search('name:contains("Cat")').map{ |node|
  node.next_element.text
}

foo # => ["0123456"]

这是有效的,因为Nokogiri包含一些jQuery CSS扩展,从而产生了一些有用的补充。

答案 2 :(得分:0)

要获取值元素文本,您需要设置xpath,如下所示:

doc = Nokogiri::HTML(<<EOT)
<body>
  <Custom>
    <count>1</count>
    <Name>Cat</Name>
    <Value>0123456</Value>
  </Custom>
  <Custom>
    <count>2</count>
    <Name>Dog</Name>
    <Value>9876543</Value>
  </Custom>
<body>
EOT

val=doc.xpath("//Custom[Name='Cat']/Value").text()

val =&gt; &#34; 0123456&#34;