Получить Nokogiri, чтобы не добавлять пространство имен по умолчанию при добавлении узлов - PullRequest
1 голос
/ 29 декабря 2010

Справочная информация:

Я хочу взять 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"/>

Ниже приведен мой код ruby:

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 ]

6 голосов
/ 04 января 2011

Обходным решением было удалить атрибут xmlns из входного файла.

Или использовать пространство_интерфейсов удаления!способ открытия входного файла

input_file = Nokogiri::XML(File.open(input))
input_file.remove_namespaces!
0 голосов
/ 29 декабря 2010

Я думаю, вам не хватает образца файла шаблона. Кроме того, образец из ввода завершен?

Nokogiri либо находит пространство имен default: во время синтаксического анализа одного из двух файлов, и вы наследуете его, либо, возможно, он недоволен образцом во время синтаксического анализа и не может выполнить синтаксический анализ, и в результате каким-то образом добавив пространство имен default:. Вы можете проверить пустоту массива errors после анализа dark_output и template_file, чтобы увидеть, счастлив ли Нокогири.

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 .

...