-1

这是我正在使用的 XML:

<order xmlns="http://example.com/schemas/1.0">
  <link type="application/xml" rel="http://example.com/rel/self" href="https://example.com/orders/1631"/>
  <link type="application/xml" rel="http://example.com/rel/order/history" href="http://example.com/orders/1631/history"/>
  <link type="application/xml" rel="http://example.com/rel/order/transition/release" href="https://example.com/orders/1631/release"/>
  <link type="application/xml" rel="http://example.com/rel/order/transition/cancel" href="https://example.com/orders/1631/cancel"/>
  <state>hold</state>
  <order-number>123-456-789</order-number>
  <survey-title>Testing</survey-title>
  <survey-url>http://example.com/s/123456</survey-url>
  <number-of-questions>6</number-of-questions>
  <number-of-completes>100</number-of-completes>
  <target-group>
    <country>
      <id>US</id>
      <name>United States</name>
    </country>
    <min-age>15</min-age>
  </target-group>
  <quote>319.00</quote>
  <currency>USD</currency>
</order>

我需要做的是从具有的href属性中获取linkrelhttp://example.com/rel/order/transition/release

那么,我怎样才能使用 Nokogiri 做到这一点?

4

2 回答 2

1

十分简单:

require 'nokogiri'

doc = Nokogiri::XML(<<EOT)
<order xmlns="http://example.com/schemas/1.0">
  <link type="application/xml" rel="http://example.com/rel/self" href="https://example.com/orders/1631"/>
  <link type="application/xml" rel="http://example.com/rel/order/history" href="http://example.com/orders/1631/history"/>
  <link type="application/xml" rel="http://example.com/rel/order/transition/release" href="https://example.com/orders/1631/release"/>
  <link type="application/xml" rel="http://example.com/rel/order/transition/cancel" href="https://example.com/orders/1631/cancel"/>
  <state>hold</state>
  <order-number>123-456-789</order-number>
  <survey-title>Testing</survey-title>
  <survey-url>http://example.com/s/123456</survey-url>
  <number-of-questions>6</number-of-questions>
  <number-of-completes>100</number-of-completes>
  <target-group>
    <country>
      <id>US</id>
      <name>United States</name>
    </country>
    <min-age>15</min-age>
  </target-group>
  <quote>319.00</quote>
  <currency>USD</currency>
</order>
EOT

href = doc.at('link[rel="http://example.com/rel/order/transition/release"]')['href']
=> "https://example.com/orders/1631/release"

这是使用 Nokogiri 使用 CSS 访问器的能力。有时使用 XPath 更容易(或唯一的方法),但我更喜欢 CSS,因为它们往往更具可读性。

Nokogiri::Node.at可以采用 CSS 访问器或 XPath,并将返回与该模式匹配的第一个节点。如果您需要遍历所有匹配项,请search改用,它返回 a NodeSet,您可以将其视为数组。Nokogiri 还支持at_xpathat_css伴随cssxpathatsearch对称。

于 2012-09-25T20:58:48.510 回答
0

这是一个单行:

@doc.xpath('//xmlns:link[@rel = "http://example.com/rel/order/transition/release"]').attr('href') 
于 2012-09-25T21:04:27.923 回答