【问题标题】:How to pull only the desired element with xml? (Nokogiri)如何使用 xml 仅拉取所需的元素? (野小切)
【发布时间】:2020-01-24 03:36:12
【问题描述】:

是否可以只从块中提取数据code="article"

<param name="Артикул" code="article">LS_745094</param>
<param name="Комментарий" code="comment"/>
<param name="Цвета" code="colors">белый, прозрачный</param>

我愿意doc.css("offer param")

接收所有param

我只需要一个&lt;param name="Артикул" code="article"&gt;LS_745094&lt;/param&gt;

【问题讨论】:

  • 欢迎来到 Stack Overflow。你的问题不清楚,也问得不好。请阅读“How to Ask”和链接页面,以及“minimal reproducible example”。我们需要您的代码的最小示例来演示问题,以及您期望的输出。

标签: ruby sinatra nokogiri


【解决方案1】:

对于给定的xml

<node>
  <param name="Артикул" code="article">LS_745094</param>
  <param name="Комментарий" code="comment"/>
  <param name="Цвета" code="colors">белый, прозрачный</param>
</node>

你可以试试这个

require 'nokogiri'

xml = Nokogiri::XML(File.open('YOUR_FILE'))    
el = xml.xpath('//param[@code="article"]')

它会给你

[#<Nokogiri::XML::Element:0x3fdf8880a8ac name="param" attributes=[#<Nokogiri::XML::Attr:0x3fdf8880a7a8 name="name" value="Артикул">, #<Nokogiri::XML::Attr:0x3fdf8880a794 name="code" value="article">] children=[#<Nokogiri::XML::Text:0x3fdf8880788c "LS_745094">]>]

然后你可以获取el的任何属性

el.text # => LS_745094

【讨论】:

    【解决方案2】:

    不清楚你在问什么,所以选择一个:

    require 'nokogiri'
    
    doc = Nokogiri::XML::DocumentFragment.parse(<<EOT)
    <param name="Артикул" code="article">LS_745094</param>
    <param name="Комментарий" code="comment"/>
    <param name="Цвета" code="colors">белый, прозрачный</param>
    EOT
    
    doc.search('param').map(&:to_html)
    # => ["<param name=\"&#x410;&#x440;&#x442;&#x438;&#x43A;&#x443;&#x43B;\" code=\"article\">",
    #     "<param name=\"&#x41A;&#x43E;&#x43C;&#x43C;&#x435;&#x43D;&#x442;&#x430;&#x440;&#x438;&#x439;\" code=\"comment\">",
    #     "<param name=\"&#x426;&#x432;&#x435;&#x442;&#x430;\" code=\"colors\">"]
    

    search 将所有匹配的节点作为 NodeSet 返回。如果您需要对它们进行迭代,那很好,但通常它是矫枉过正的。

    doc.at('param')['code'] # => "article"
    doc.at('param').text # => "LS_745094"
    

    atsearch('...').first 相同,返回第一个匹配节点。所以上面的代码找到第一个&lt;param&gt;并返回它。如果您知道您想要的标签始终是第一个标签,那将很有用。

    doc.at('param[code="article"]').text # => "LS_745094"
    doc.at('param[name="Артикул"]')['code'] # => "article"
    doc.at('param[name="Артикул"]').text # => "LS_745094"
    

    如果您需要为选择器提供更多详细信息,您可以使用标签中的参数及其值。获得所需节点后,您可以通过将其视为哈希来访问其参数,或者,如果您想要节点包装的文本,请使用 text

    注意,我使用的是 CSS 选择器。 Nokogiri 支持 CSS 和 XPath 选择器。 CSS 更具可读性,足以满足大多数查找。 XPath 更强大,通常更复杂且视觉上很嘈杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多