Как удалить элемент из XML с помощью Nokogiri - PullRequest
0 голосов
/ 30 октября 2019

Учитывая этот 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>

Я хочу воссоздать XML-файл, используя Nokogiri, но я хочу удалить элементы, где "products price = 0", чтобы он выглядел так:

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

Я много чего пробовал, но ничего не получается.

Ответы [ 2 ]

1 голос
/ 06 ноября 2019

Это более идиоматичный код 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 it:

File.write('myfile.xml', doc.to_xml)
0 голосов
/ 30 октября 2019

Нокогири использует XPath, и с этим я могу запросить XML-файл:

Это так просто, как это:

require 'nokogiri'

doc = File.open("file_with_your.xml") { |f| Nokogiri::XML(f) }   // load your file with xml content

c = doc.xpath("//product[price!=0]")                             //this is the query
puts c                                                           // you can print the results
File.open("myfile.xml", "w+") do |f|                             // and create another file
  f << c
end
...