如何使用 Nokogiri 从 XML 中删除一个元素
How to remove an element from XML using Nokogiri
鉴于此 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 文件,但我想删除 "products price = 0" 中的元素,因此它看起来像:
<products>
<product>
<name> product1 </name>
<price> 21 </price>
</product>
<product>
<name> product3 </name>
<price> 10 </price>
</product>
</products>
我尝试了很多东西,但似乎没有任何效果。
Nokogiri 使用 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
这是更惯用的 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)
鉴于此 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 文件,但我想删除 "products price = 0" 中的元素,因此它看起来像:
<products>
<product>
<name> product1 </name>
<price> 21 </price>
</product>
<product>
<name> product3 </name>
<price> 10 </price>
</product>
</products>
我尝试了很多东西,但似乎没有任何效果。
Nokogiri 使用 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
这是更惯用的 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)