XML中的尖括号替换为HTML代码?

时间:2014-04-03 12:39:49

标签: ruby xml nokogiri

我正在尝试阅读XML文件(configs.xml)的内容,并将其插入另一个XML文件(workspace.xml)的中间位置。

这是代码:

require "nokogiri" 

workspace = File.open("workspace.xml")
xml = Nokogiri::XML(workspace)
workspace.close

# Add new configs
configs = File.read("configs.xml")
xml.search('component[name="RunManager"]').each do |node|
    node.content=configs
end

puts xml

输出如下:

<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="AndroidLayoutPreviewToolWindow">
    <option name="state">
      <GlobalState/>
    </option>
  </component>
  <component name="RunManager" selected="Android Application.Run on device">    
    &lt;configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests"&gt;
      &lt;module name="" /&gt;
      &lt;option name="TESTING_TYPE" value="0" /&gt;
      &lt;option name="INSTRUMENTATION_RUNNER_CLASS" value="" /&gt;
      &lt;option name="METHOD_NAME" value="" /&gt;
      &lt;option name="CLASS_NAME" value="" /&gt;         
    &lt;/configuration&gt;
</component>
  <component name="ShelveChangesManager" show_recycled="false"/>
  <component name="SliceManager" selected="Android Application.Run on device">
    <option name="analysisUIOptions">
      <AnalysisUIOptions/>
    </option>
  </component>
</project>

正如您所看到的,中间插入的内容将所有角括号< >替换为HTML代码&lt; &gt,我不知道为什么,但我怀疑这必须与编码。

最有趣的是,如果单独打印configs.xml的内容(插入和修改的内容),则输出符合预期:

<configuration default="true" type="AndroidTestRunConfigurationType" factoryName="Android Tests">
      <option name="TESTING_TYPE" value="0" />
      <option name="INSTRUMENTATION_RUNNER_CLASS" value="" />
      <option name="METHOD_NAME" value="" />
      // ............
</configuration>

1 个答案:

答案 0 :(得分:1)

当您设置节点的内容时,实际上设置了 text 内容,这意味着,Nokogiri会自动将其删除。

要向XML添加节点,您需要使用add_child

configs = File.read("configs.xml")
xml.search('component[name="RunManager"]').each do |node|
    node.add_child configs
end