Версии Nokogiri 1.10.5 и более поздние приводят к различным ошибкам проверки версии 1.10.4 относительно XSD-файлов ONIX v2.1 и v3, и я не могу найти каких-либо коммитов в этом выпуске и измененных зависимостей ( libxml2-2.9.10 и libxslt 1.1.34 ), что может вызвать такое изменение в поведении.
Я создал небольшой пример недопустимого ONIX XML (ff
- недопустимая запись списка в <ProductForm>ff</ProductForm>
):
XSD_FILE = 'reference/ONIX_BookProduct_Release2.1_reference.xsd'.freeze
VALIDATION_NODE = <<-END_XML.freeze
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<ONIXMessage xmlns=\"http://www.editeur.org/onix/2.1/reference\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://www.editeur.org/onix/2.1/reference #{XSD_FILE}\">
<Header>
<FromCompany>Company</FromCompany>
<ToCompany>OtherCompany</ToCompany>
<SentDate>20140912</SentDate>
</Header>
<Product>
<RecordReference>9780954575915</RecordReference>
<NotificationType>03</NotificationType>
<ProductIdentifier>
<!-- GTIN-13 -->
<ProductIDType>03</ProductIDType>
<IDValue>9780954575915</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<!-- ISBN -->
<ProductIDType>15</ProductIDType>
<IDValue>9780954575915</IDValue>
</ProductIdentifier>
<ProductIdentifier>
<ProductIDType>01</ProductIDType>
<IDTypeName>Publisher's Reference</IDTypeName>
<IDValue>publishers_reference</IDValue>
</ProductIdentifier>
<ProductForm>ff</ProductForm>
<ProductFormDetail>B401</ProductFormDetail>
</Product>
</ONIXMessage>
END_XML
И создал для него тест, который использует ONIX XSD:
gem 'nokogiri', '1.10.4'
require 'nokogiri'
require 'minitest/autorun'
require_relative '../reference/constants.rb'
class Test < MiniTest::Spec
describe "XSD validation of invalid ONIX 2.1 XML using Nokogiri 1.10.4" do
it "should produce validation errors" do
product = Nokogiri::XML(VALIDATION_NODE)
errors = Nokogiri::XML::Schema(File.open(XSD_FILE)).
validate(product).
map(&:to_s)
# declutter the errors
errors.map! {|e| e.gsub("{http://www.editeur.org/onix/2.1/reference}", "")}
assert_equal [
"26:0: ERROR: Element 'ProductForm': [facet 'enumeration'] The value 'ff' is not an element of the set {'00', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AZ', 'BA', 'BB', 'BC', 'BD', 'BE', 'BF', 'BG', 'BH', 'BI', 'BJ', 'BK', 'BL', 'BM', 'BN', 'BO', 'BP', 'BZ', 'CA', 'CB', 'CC', 'CD', 'CE', 'CZ', 'DA', 'DB', 'DC', 'DD', 'DE', 'DF', 'DG', 'DH', 'DI', 'DJ', 'DK', 'DL', 'DM', 'DN', 'DO', 'DZ', 'FA', 'FB', 'FC', 'FD', 'FE', 'FF', 'FZ', 'MA', 'MB', 'MC', 'MZ', 'PA', 'PB', 'PC', 'PD', 'PE', 'PF', 'PG', 'PH', 'PI', 'PJ', 'PK', 'PL', 'PM', 'PN', 'PO', 'PP', 'PQ', 'PR', 'PS', 'PT', 'PZ', 'VA', 'VB', 'VC', 'VD', 'VE', 'VF', 'VG', 'VH', 'VI', 'VJ', 'VK', 'VL', 'VM', 'VN', 'VO', 'VP', 'VZ', 'WW', 'WX', 'XA', 'XB', 'XC', 'XD', 'XE', 'XF', 'XG', 'XH', 'XI', 'XJ', 'XK', 'XL', 'XM', 'XZ', 'ZA', 'ZB', 'ZC', 'ZD', 'ZE', 'ZF', 'ZG', 'ZH', 'ZI', 'ZJ', 'ZY', 'ZZ'}.",
"26:0: ERROR: Element 'ProductForm': 'ff' is not a valid value of the atomic type 'List7'.",
"8:0: ERROR: Element 'Product': Missing child element(s). Expected is one of ( ProductFormDetail, ProductFormFeature, BookFormDetail, ProductPackaging, ProductFormDescription, NumberOfPieces, TradeCategory, ProductContentType, ContainedItem, ProductClassification ).",
],
errors
end
end
end
Тест проходит при указании версии 1.10.4 и завершается с ошибкой в 1.10.5 и выше, поскольку он не возвращает следующую ошибку:
"26:0: ERROR: Element 'ProductForm': 'ff' is not a valid value of the atomic type 'List7'."
Вот zip-файл с тестовыми приспособлениями, по проблеме, поднятой в репозитории gem, которую вы можете запустить с $ ruby -Ilib:test 1.10.4/test_case.rb
и $ ruby -Ilib:test 1.10.5/test_case.rb