使用Nokogiri插入和删除XML节点和元素

16 ruby nokogiri

我想提取XML文件的一部分,并记下我在该文件中提取了一些部分,比如"这里提取的东西".

我正试图用Nokogiri这样做,但似乎没有真正记录如何:

  1. 删除a的所有孩子 <Nokogiri::XML::Element>
  2. 改变inner_text那个完整的元素

有线索吗?

Pes*_*sto 16

Nokogiri让这很容易.使用此文件作为一个例子,下面的代码会发现所有vitamins的标签,消除他们的孩子(和孩子的孩子,等等),并改变自己内心的文字说:"孩子中删除.":

require 'nokogiri'

io = File.open('sample.xml', 'r')
doc = Nokogiri::XML(io)
io.close

doc.search('//vitamins').each do |node|
  node.children.remove
  node.content = 'Children removed.'
end
Run Code Online (Sandbox Code Playgroud)

给定food节点将如下所示:

<food>
    <name>Avocado Dip</name>
    <mfr>Sunnydale</mfr>
    <serving units="g">29</serving>
    <calories total="110" fat="100"/>
    <total-fat>11</total-fat>
    <saturated-fat>3</saturated-fat>
    <cholesterol>5</cholesterol>
    <sodium>210</sodium>
    <carb>2</carb>
    <fiber>0</fiber>
    <protein>1</protein>
    <vitamins>
        <a>0</a>
        <c>0</c>
    </vitamins>
    <minerals>
        <ca>0</ca>
        <fe>0</fe>
    </minerals>
</food>
Run Code Online (Sandbox Code Playgroud)

对此:

<food>
    <name>Avocado Dip</name>
    <mfr>Sunnydale</mfr>
    <serving units="g">29</serving>
    <calories total="110" fat="100"/>
    <total-fat>11</total-fat>
    <saturated-fat>3</saturated-fat>
    <cholesterol>5</cholesterol>
    <sodium>210</sodium>
    <carb>2</carb>
    <fiber>0</fiber>
    <protein>1</protein>
    <vitamins>Children removed.</vitamins>
    <minerals>
        <ca>0</ca>
        <fe>0</fe>
    </minerals>
</food>
Run Code Online (Sandbox Code Playgroud)


小智 3

你可以这样做:

doc=Nokogiri::XML(your_document)
note=doc.search("note") # find all tags with the node_name "note"
note.remove
Run Code Online (Sandbox Code Playgroud)

虽然这会删除<note>标签内的所有子元素,但我不确定如何“更改所有注释元素的inner_text”。我认为inner_text不适用于 Nokogiri::XML::Element。