【问题标题】:How to select an element using Nokogiri如何使用 Nokogiri 选择元素
【发布时间】:2016-08-10 13:47:31
【问题描述】:

鉴于以下 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>

【问题讨论】:

    标签: ruby xml nokogiri


    【解决方案1】:

    我只想要“值”而不是整个自定义节点。

    所以继续写路径:

    //Custom[Name="Cat"]/Value
    

    【讨论】:

      【解决方案2】:

      为了可读性,我更喜欢使用 CSS 选择器而不是 XPath,因为通常 CSS 包含较少的视觉噪音:

      需要'nokogiri'

      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 扩展,从而产生了一些有用的添加。

      【讨论】:

        【解决方案3】:

        要获取值元素文本,您需要设置 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 => "0123456"

        【讨论】:

          猜你喜欢
          • 2014-08-19
          • 2017-05-04
          • 1970-01-01
          • 2020-10-26
          • 2023-02-25
          • 2021-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多