我正在尝试从数组创建一个XML文件。这是我的建造者代码:
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
我的输入看起来是这样的(它总是在第一个索引上包含一个文章编号,然后从第二个到N-3个索引进行描述,N-2到N-1是金额,第N个索引包含条形码):
["047609", "СОК", "СВЕЖЕВЫЖАТЫЙ", "ТОМАТ", "200", "МЛ", "(фреш", "дня)", "1", "шт", "2400000032731"]["048504", "ВОДА", "ГАЗИРОВАННАЯ", "С", "НАТУРАЛЬНЫМ", "СИРОПОМ", "(200МЛ)", "1", "шт", "2400000032953"]["055794", "СОК", "СВЕЖЕВЫЖАТЫЙ", "В", "АССОРТИМЕНТЕ", "(200МЛ)", "1", "шт", "2400000036425"]["058270", "СОК", "СВЕЖЕВЫЖАТЫЙ", "КЛУБНИКА", "+ЯБЛОКО", "200", "МЛ", "(фреш", "дня)", "1", "шт", "2400000037149"]
这导致了这样的事情:
<articleNumber>055794</articleNumber>
<description>СОК СВЕЖЕВЫЖАТЫЙ В АССОРТИМЕНТЕ (200МЛ) 1 шт</description>
<shtrihCode>2400000036425</shtrihCode>
</item>
<item>
<articleNumber>058270</articleNumber>
<description>СОК СВЕЖЕВЫЖАТЫЙ КЛУБНИКА +ЯБЛОКО 200 МЛ (фреш дня) 1 шт</description>
<shtrihCode>2400000037149</shtrihCode>
</item>
</products>
基本上,我希望XML中的描述显示正确的西里尔字母。
我可以以某种方式强制构建器使用特定的编码吗?我已经找到了很多关于如何打开具有特定编码的XML文件的材料,例如使用Nokogiri::XML(a, nil, "UTF-8")
,但没有找到关于如何构建有效XML的材料。
令人惊讶的是,如果我省略了文本上的代码块,SO会很好地显示我的文本。
经过数小时的尝试,我发现了这篇文章-我如何用Ruby编码/解码HTML实体?
您需要根据下表对С
等值进行解码: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>