diff --git a/src/Plugin/migrate_plus/data_parser/SimpleXml.php b/src/Plugin/migrate_plus/data_parser/SimpleXml.php index a33b6a086901abf74cfd0a86bcddc177fbcfd66b..8a58d8b075c5d2bf77ed7a2ef634e54e0e1b0699 100644 --- a/src/Plugin/migrate_plus/data_parser/SimpleXml.php +++ b/src/Plugin/migrate_plus/data_parser/SimpleXml.php @@ -77,7 +77,7 @@ class SimpleXml extends DataParserPluginBase { } // Reduce single-value results to scalars. foreach ($this->currentItem as $field_name => $values) { - if (count($values) == 1) { + if (is_array($values) && count($values) == 1) { $this->currentItem[$field_name] = reset($values); } } diff --git a/tests/data/simple_xml_reduce_single_value.xml b/tests/data/simple_xml_reduce_single_value.xml new file mode 100644 index 0000000000000000000000000000000000000000..0cffd2890844911620445a73e0c9dc815d238fce --- /dev/null +++ b/tests/data/simple_xml_reduce_single_value.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<items> + <item id="1"> + <values title="Values"> + <value>Value 1</value> + <value>Value 2</value> + </values> + </item> + <item id="2"> + <values title="Values"> + <value>Value 1 (single)</value> + </values> + </item> +</items> diff --git a/tests/src/Kernel/Plugin/migrate_plus/data_parser/SimpleXmlTest.php b/tests/src/Kernel/Plugin/migrate_plus/data_parser/SimpleXmlTest.php new file mode 100644 index 0000000000000000000000000000000000000000..fe6b345e1dfd53383924f7cf0b4ded3e75203ccc --- /dev/null +++ b/tests/src/Kernel/Plugin/migrate_plus/data_parser/SimpleXmlTest.php @@ -0,0 +1,77 @@ +<?php + +namespace Drupal\Tests\migrate_plus\Kernel\Plugin\migrate_plus\data_parser; + +use Drupal\KernelTests\KernelTestBase; + +/** + * Test of the data_parser SimpleXml migrate_plus plugin. + * + * @group migrate_plus + */ +class SimpleXmlTest extends KernelTestBase { + + public static $modules = ['migrate', 'migrate_plus']; + + /** + * Tests reducing single values. + * + * @throws \Drupal\Component\Plugin\Exception\PluginException + * @throws \Exception + */ + public function testReduceSingleValue() { + $path = $this->container + ->get('module_handler') + ->getModule('migrate_plus') + ->getPath(); + $url = $path . '/tests/data/simple_xml_reduce_single_value.xml'; + + /** @var \Drupal\migrate_plus\DataParserPluginManager $plugin_manager */ + $plugin_manager = $this->container + ->get('plugin.manager.migrate_plus.data_parser'); + $conf = [ + 'plugin' => 'url', + 'data_fetcher_plugin' => 'file', + 'data_parser_plugin' => 'simple_xml', + 'destination' => 'node', + 'urls' => [$url], + 'ids' => ['id' => ['type' => 'integer']], + 'fields' => [ + [ + 'name' => 'id', + 'label' => 'Id', + 'selector' => '@id', + ], + [ + 'name' => 'values', + 'label' => 'Values', + 'selector' => 'values', + ], + ], + 'item_selector' => '/items/item', + ]; + $parser = $plugin_manager->createInstance('simple_xml', $conf); + + $data = []; + foreach ($parser as $item) { + $values = []; + foreach ($item['values'] as $value) { + $values[] = (string) $value; + } + $data[] = $values; + } + + $expected = [ + [ + 'Value 1', + 'Value 2', + ], + [ + 'Value 1 (single)', + ], + ]; + + $this->assertEquals($expected, $data); + } + +}