首页 > 解决方案 > 如何使用 Nokogiri 从 XML 中删除元素

问题描述

鉴于此 HTML:

 <products>
    <product>
      <name> product1 </name>
      <price> 21 </price>
    </product>
    <product>
      <name> product2 </name>
      <price> 0 </price>
    </product>
        <product>
      <name> product3 </name>
      <price> 10 </price>
    </product>
  </products>

我想使用 Nokogiri 重新创建一个 XML 文件,但我想删除“产品价格 = 0”的元素,所以它看起来像:

 <products>
    <product>
      <name> product1 </name>
      <price> 21 </price>
    </product>
    <product>
      <name> product3 </name>
      <price> 10 </price>
    </product>
  </products>

我尝试了很多东西,但似乎没有任何效果。

标签: rubyxmlparsingnokogiri

解决方案


这是更惯用的 Nokogiri 和 Ruby 代码:

require 'nokogiri'

xml =<<EOT
 <products>
    <product>
      <name> product1 </name>
      <price> 21 </price>
    </product>
    <product>
      <name> product2 </name>
      <price> 0 </price>
    </product>
        <product>
      <name> product3 </name>
      <price> 10 </price>
    </product>
  </products>
EOT

doc = Nokogiri::XML(xml)

# strip the offending nodes
doc.xpath('//product/price[text()=" 0 "]/..').remove

此时生成的 XML 如下所示:

doc.to_xml
# => "<?xml version=\"1.0\"?>\n" +
#    "<products>\n" +
#    "    <product>\n" +
#    "      <name> product1 </name>\n" +
#    "      <price> 21 </price>\n" +
#    "    </product>\n" +
#    "    \n" +
#    "        <product>\n" +
#    "      <name> product3 </name>\n" +
#    "      <price> 10 </price>\n" +
#    "    </product>\n" +
#    "  </products>\n"

然后简单地write说:

File.write('myfile.xml', doc.to_xml)

推荐阅读