2015-12-16 9 views
0

Я пытаюсь создать XML-файл из массива. Это мой строитель код:Nokogiri XML-редактор с кириллическим текстом (windows 1251)

def buildXML(formattedText) 
    builder = Nokogiri::XML::Builder.new do |xml| 
     xml.products { 
      formattedText.each do |lineItem| 
       xml.item { 
        xml.articleNumber lineItem[0] 
        description = lineItem[1..(findIndexOnShtrih(lineItem)-1)].join(" ").force_encoding(Encoding::Windows_1251) 
        xml.description description 
        xml.shtrihCode lineItem.at(findIndexOnShtrih(lineItem)) 
       } 
      end 

     } 
    end 
end 

Мой вход выглядит следующим образом (содержит всегда номер статьи на 1-й индекс, то есть идет описание от 2-го по N-3 индекса, N-2 до N-1 является количество и Nth индекс содержит штрих-код):

["047609", "СОК", "СВЕЖЕВЫЖАТЫЙ", "ТОМАТ", "200", "МЛ", "(фреш", "дня)", "1", "шт", "2400000032731"]["048504", "ВОДА", "ГАЗИРОВАННАЯ", "С", "НАТУРАЛЬНЫМ", "СИРОПОМ", "(200МЛ)", "1", "шт", "2400000032953"]["055794", "СОК", "СВЕЖЕВЫЖАТЫЙ", "В", "АССОРТИМЕНТЕ", "(200МЛ)", "1", "шт", "2400000036425"]["058270", "СОК", "СВЕЖЕВЫЖАТЫЙ", "КЛУБНИКА", "+ЯБЛОКО", "200", "МЛ", "(фреш", "дня)", "1", "шт", "2400000037149"] 

Это приводит к вещи, как это:

<articleNumber>055794</articleNumber> 
    <description>&#x421;&#x41E;&#x41A; &#x421;&#x412;&#x415;&#x416;&#x415;&#x412;&#x42B;&#x416;&#x410;&#x422;&#x42B;&#x419; &#x412; &#x410;&#x421;&#x421;&#x41E;&#x420;&#x422;&#x418;&#x41C;&#x415;&#x41D;&#x422;&#x415; (200&#x41C;&#x41B;) 1 &#x448;&#x442;</description> 
    <shtrihCode>2400000036425</shtrihCode> 
    </item> 
    <item> 
    <articleNumber>058270</articleNumber> 
    <description>&#x421;&#x41E;&#x41A; &#x421;&#x412;&#x415;&#x416;&#x415;&#x412;&#x42B;&#x416;&#x410;&#x422;&#x42B;&#x419; &#x41A;&#x41B;&#x423;&#x411;&#x41D;&#x418;&#x41A;&#x410; +&#x42F;&#x411;&#x41B;&#x41E;&#x41A;&#x41E; 200 &#x41C;&#x41B; (&#x444;&#x440;&#x435;&#x448; &#x434;&#x43D;&#x44F;) 1 &#x448;&#x442;</description> 
    <shtrihCode>2400000037149</shtrihCode> 
    </item> 
</products> 

в принципе, я хочу, описание в формате XML, чтобы показать соответствующие буквы кириллицы.

Могу ли я каким-то образом заставить строителя использовать определенную кодировку? Я нашел много материалов о том, как открыть XML-файлы с определенной кодировкой, например, с помощью Nokogiri::XML(a, nil, "UTF-8"), но ничего не о том, как создать корректный XML.

Удивительно, если я опускаю блок кода в свой текст, SO отображает мой текст в порядке.

+0

Добро пожаловать на переполнение стека. Укажите минимальные входные данные и ожидаемый результат. Это помогает нам помочь вам и предоставляет другим, которые ищут подобный ответ, идею о том, как ваш код будет соответствовать их прецеденту. –

+0

Кроме того, в Ruby методы и переменные записываются в snake_case, а не в camelCase. It's_a_matter_of_readability AndCodeStyleInTheCommunity. –

+0

Вам действительно нужно принудительное кодирование, а не кодирование? –

ответ

0

После нескольких часов безуспешных попыток нашел этот пост - How do I encode/decode HTML entities in Ruby?

Вам нужно сделать декодирует такие ценности, как &#x421; в соответствии с этой таблицей: http://webdesign.about.com/od/localization/l/blhtmlcodes-ru.htm

CGI не помог мне, но HTMLEntities сделал.

Это мой рабочий код прямо сейчас:

require 'htmlentities' 
puts HTMLEntities.new.decode(buildXML(cleansedArray).to_xml) 

И, наконец, желаемый выход:

<item> 
    <articleNumber>055794</articleNumber> 
    <description>СОК СВЕЖЕВЫЖАТЫЙ В АССОРТИМЕНТЕ (200МЛ) 1 шт</description> 
    <shtrihCode>2400000036425</shtrihCode> 
    </item> 
    <item> 
    <articleNumber>058270</articleNumber> 
    <description>СОК СВЕЖЕВЫЖАТЫЙ КЛУБНИКА +ЯБЛОКО 200 МЛ (фреш дня) 1 шт</description> 
    <shtrihCode>2400000037149</shtrihCode> 
    </item> 
</products>