Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何使用Nokogiri替换XML节点内容_Ruby_Xml_Xml Parsing_Nokogiri - Fatal编程技术网

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

Ruby 如何使用Nokogiri替换XML节点内容,ruby,xml,xml-parsing,nokogiri,Ruby,Xml,Xml Parsing,Nokogiri,我使用Ruby读取XML文档,并使用新值更新单个节点(如果存在) 我不知道如何更改节点数据,更不用说如何将其保存回文件 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| !

我使用Ruby读取XML文档,并使用新值更新单个节点(如果存在)

我不知道如何更改节点数据,更不用说如何将其保存回文件

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>

要更改XML中的元素,请执行以下操作:

@doc = Nokogiri::XML::DocumentFragment.parse <<-EOXML
<body>
  <h1>OLD_CONTENT</h1>
  <div>blah</div>
</body>
EOXML


h1 = @doc.at_xpath "body/h1"
h1.content = "NEW_CONTENT"

puts @doc.to_xml   #h1 will be NEW_CONTENT
您的示例XML有一些问题

  • 有两个根元素
    my_id
    Route
  • 第一个标记中缺少
  • 您需要最后一行吗
修复样本后,我能够使用Phrogz的示例获得元素:

element = @doc.xpath("Route//To//Node//Filename[.='#{target_file}']").first 
注意
。首先
,因为它将返回节点集

然后我会用以下内容更新内容:

element.content = "foobar"
def amend_parent_xml(文件夹、目标文件、新文件)
Dir[“#{@target_folder}/#{folder}/*.xml”]
.sort.选择{| f |!File.directory?f}
.每个do | xml_文件|
doc=Nokogiri.XML(File.read(XML_文件))
如果file=doc.at(“//Route//To//Node//Filename[.='{target_file}']))
file.content=new_file#设置节点的文本

open(xml_文件,'w'){| f | fOK..在我的示例中,您的代码如何知道要更新的//路由//到//节点//文件名…在我的XML中有几个,这就是为什么我在它们之间循环,如果您在XML文档中查找特定元素,我将使用xpath。您可以发布示例XML文档吗?保存XML文本文件时不需要二进制模式。除非你想在Windows上使用不正确的行尾吗?我在我的回答中添加了更多信息,这是一个在周一上班的好方法。这很好,现在我对Nokogiri的工作原理有了更多的了解!!(我现在也知道如何拼写Amend:p)
element = @doc.xpath("Route//To//Node//Filename[.='#{target_file}']").first 
element.content = "foobar"
def amend_parent_xml(folder, target_file, 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