在添加节点时,让Nokogiri不添加“默认”命名空间

时间:2010-12-29 14:37:23

标签: ruby xml nokogiri

背景:

我想从一个文件中获取一些xml,将其放在模板文件中,然后将修改后的模板另存为新文件。它可以工作,但是当我保存文件时,我添加的所有节点都有一个预先设置的默认命名空间,即

        <default:ComponentRef Id="C__AD1817F9C64A42F0A14DDDDC82DFC8D9"/>
        <default:ComponentRef Id="C__157DD41D70854617A3D6D1E4A39B589F"/>
        <default:ComponentRef Id="C__2E6D8662F38FE62CAFA9F8842A28F510"/>
        <default:ComponentRef Id="C__54E5E2181323D4A5F37293DAA87B4230"/>

我想要的只是:

        <ComponentRef Id="C__AD1817F9C64A42F0A14DDDDC82DFC8D9"/>
        <ComponentRef Id="C__157DD41D70854617A3D6D1E4A39B589F"/>
        <ComponentRef Id="C__2E6D8662F38FE62CAFA9F8842A28F510"/>
        <ComponentRef Id="C__54E5E2181323D4A5F37293DAA87B4230"/>

以下是我的红宝石代码:

file = "wixmain/generated/DarkOutput.wxs"
template = "wixmain/generated/MsiComponentTemplate.wxs"
output = "wixmain/generated/MSIComponents.wxs"

dark_output = Nokogiri::XML(File.open(file))
template_file = Nokogiri::XML(File.open(template))

#get stuff from dark output
components = dark_output.at_css("Directory[Id='TARGETDIR']")
component_ref = dark_output.at_css("Feature[Id='DefaultFeature']")

#where to insert in template doc
template_component_insert_point = template_file.at_css("DirectoryRef[Id='InstallDir']")
template_ref_insert_point = template_file.at_css("ComponentGroup[Id='MSIComponentGroup']")

template_component_insert_point.children= components.children()
template_ref_insert_point.children= component_ref.children()

#write out filled template to output file
File.open(output, 'w') { |f| template_file.write_xml_to f }

更新

我的模板文件示例:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>
  <Fragment>
    <ComponentGroup Id='MSIComponentGroup'>
    </ComponentGroup>
  </Fragment>
  <Fragment Id='MSIComponents'>
      <DirectoryRef Id='InstallDir'>
      </DirectoryRef>
  </Fragment>
</Wix>

2 个答案:

答案 0 :(得分:6)

解决方法是删除输入文件中的xmlns属性。

或者使用remove_namespaces!打开输入文件时的方法

input_file = Nokogiri::XML(File.open(input))
input_file.remove_namespaces!

答案 1 :(得分:0)

我认为您缺少模板文件的示例。此外,输入的样本是否完整?

Nokogiri要么在解析两个文件中的一个时找到default:命名空间,要么继承它,或者在解析过程中它对样本不满意,并且无法干净地解析,并且结果以某种方式添加default:命名空间。解析errorsdark_output后,您可以检查template_file数组的空白情况,看看Nokogiri是否满意。

dark_output = Nokogiri::XML(File.open(file))
template_file = Nokogiri::XML(File.open(template))

if (dark_output.errors.any? || template_file.errors.any?)
  [... do something here ...]
end

要获得最快的答案,您可能希望通过Nokogiri-Talk mail-list直接将此问题提交给开发人员。