Перенесенные данные с помощью XML не импортируются в узлы
Ссылка на мой предыдущий вопрос, в котором содержится информация о структуре данных и т.д.
Теперь я прочитал свой XML в Migrate и правильно настроил тип контента и поля (я думаю), но теперь я не могу сохранить узлы. Импорт содержит правильное количество узлов, но они никогда не импортируются. В примерах wine в документации ничего не говорилось об использовании prepareRow() или о чем-либо еще, когда вы используете XML. Где мои узлы? Могу ли я извлечь эти данные с помощью Представления, даже если узлы не импортируются? Мое конечное использование для этого - упорядочить все с помощью представлений.
РЕДАКТИРОВАТЬ
Вот мой класс:
<?php
class ItemNodeMigration extends XMLMigration {
public function __construct() {
parent::__construct(MigrateGroup::getInstance('itemnode', array('default')));
$this->description = t('Grab data in XML');
// There isn't a consistent way to automatically identify appropriate "fields"
// from an XML feed, so we pass an explicit list of source fields
$fields = array(
'id' => 'ID',
'type' => t('Description of producer'),
'Owner' => t('Owner'),
'Text' => t('Text'),
'modifiedAt' => 'Date last changed',
);
$this->map = new MigrateSQLMap($this->machineName,
array(
'id' => array(
'type' => 'varchar',
'length' => 6,
'not null' => TRUE,
)
),
MigrateDestinationNode::getKeySchema()
);
// This can also be an URL instead of a file path.
$xml_folder = 'http://example.com/item/';
$list_url = 'http://example.com/CompanyID/Items.xml';
// Each ID retrieved from the list URL will be plugged into :id in the
// item URL to fetch the specific objects.
$item_url = $xml_folder . ':id/desc.xml';
$this->source = new MigrateSourceList(new MigrateListXML($list_url),
new MigrateItemXML($item_url), $fields);
$this->destination = new MigrateDestinationNode('migrate_module_itemnode');
$this->addFieldMapping('id', 'id')
->xpath('/@id');
$this->addFieldMapping('body', 'Text')
->xpath('/Text');
$this->addFieldMapping('type', 'type')
->xpath('/@type');
$this->addFieldMapping('owner', 'Owner')
->xpath('/@Owner');
$this->addFieldMapping('created', 'modifiedAt')
->xpath('/@modifiedAt');
}
}
ПРАВКА2: Я определил, что моя проблема заключается здесь:
$this->map = new MigrateSQLMap($this->machineName,
array(
'id' => array(
'type' => 'varchar',
'length' => 6,
'not null' => TRUE,
)
),
MigrateDestinationNode::getKeySchema()
);
Это неверно сопоставляется с идентификатором моего источника, который находится в пункте/@id. Как я могу это исправить?
1 answers
В соответствии с этой проблемой - Я думаю, вам нужно указать MigrateSourceList
, где находятся ваши идентификаторы элементов, в качестве примера (из isssue):
// As with MigrateSourceMultiItems, this applies where there is not a separate
// list of IDs to process - the source XML file is entirely self-contained.
// For the ID path, and xpath for each component, we can use the full xpath
// syntax as usual. However, the syntax to select the elements that correspond
// to objects to import is more limited. It must be a fully-qualified path
// to the element (i.e., /producers/producer rather than just //producer).
// $item_xpath = '/producers/producer'; // relative to document
$item_xpath = '/FMPXMLRESULT/RESULTSET/ROW';
// $item_ID_xpath = 'sourceid'; // relative to item_xpath
$item_ID_xpath = 'COL[1]/DATA';
$this->source = new MigrateSourceXML($items_url, $item_xpath, $item_ID_xpath,
$fields);
В вашем конструкторе есть только 3 значения. Я не очень много занимался миграцией XML (только CSV и SQL). Этот вопрос касается D7 - я думаю, что он должен относиться к D6.