加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 如何使用Nokogiri替换XML节点内容

发布时间:2020-12-17 03:24:19 所属栏目:百科 来源:网络整理
导读:我正在使用 Ruby来读取XML文档并使用新值更新单个节点(如果存在). http://www.nokogiri.org/tutorials/modifying_an_html_xml_document.html 对我来说如何更改节点数据并不明显,更不用说如何将其保存回文件. def ammend_parent_xml(folder,target_file,new_f
我正在使用 Ruby来读取XML文档并使用新值更新单个节点(如果存在).

http://www.nokogiri.org/tutorials/modifying_an_html_xml_document.html
对我来说如何更改节点数据并不明显,更不用说如何将其保存回文件.

def ammend_parent_xml(folder,target_file,new_file)
  # open parent XML file that contains file reference
  get_xml_files = Dir.glob("#{@target_folder}/#{folder}/*.xml").sort.select {|f| !File.directory? f}
  get_xml_files.each { |xml|

    f       = File.open(xml)

    # Use Nokgiri to read the file into an XML object
    doc     = Nokogiri::XML(f)
    filename  = doc.xpath('//Route//To//Node//FileName')

    filename.each_with_index {
      |fl,i|
      if target_file == fl.text
        # we found the file,now rename it to new_file
        # ???????
      end

    }

  }

end

这是一些示例XML:

<?xml version="1.0" encoding="utf-8">
    <my_id>123</my_id>
    <Route>
      <To>
        <Node>
          <Filename>file1.txt</Filename>
          <Filename>file2.mp3</Filename>
          <Filename>file3.doc</Filename>
          <Filename>file4.php</Filename>
          <Filename>file5.jpg</Filename>
        </Node>
      </To>
    </Route>
</xml>

我想将“file3.doc”更改为“file3_new.html”.

我打电话给:

def ammend_parent_xml("folder_location","file3.doc","file3_new.html")

解决方法

def amend_parent_xml(folder,new_file)
  Dir["#{@target_folder}/#{folder}/*.xml"]
  .sort.select{|f| !File.directory? f }
  .each do |xml_file|
    doc = Nokogiri.XML( File.read(xml_file) )
    if file = doc.at("//Route//To//Node//Filename[.='#{target_file}']")
      file.content = new_file # set the text of the node
      File.open(xml_file,'w'){ |f| f<<doc }
      break
    end
  end
end

改进:

>使用File.read而不是File.open,这样就不会打开文件句柄.
>使用XPath表达式通过查找具有正确文本值的节点来查找SINGLE匹配节点.

>或者你可以找到所有文件,然后如果file = files.find {| f | f.text == target_file}

>显示如何将Nokogiri :: XML :: Document序列化回磁盘.>一旦找到匹配的XML文件,就不会处理文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读