Drupal Feeds - анализирует XML перед импортом
У меня есть этот XML:
<xml>
<data>
<name id=01">
Pippo
</name>
<name id=02>
Pinco
</name>
<surname id=01">
Franco
</surname>
<surname id=02>
Pallino
</surname>
</data>
<xml>
Я хочу импортировать в узел, просто материал с атрибутом id=01. Для этого я перепробовал много дорог, но ни у кого не получилось. Поэтому я подумываю об изменении xml во время подготовки, чтобы создать xml вроде:
<xml>
<data>
<name id=01">
Pippo
</name>
<surname id=01">
Franco
</surname>
</data>
<data>
<name id=02>
Pinco
</name>
<surname id=02>
Pallino
</surname>
</data>
<xml>
и иметь модуль каналов, создающий два узла с полезными данными. Но я не нашел способа и полезных зацепок для этого с модулем каналов.
1 ответ
Создайте собственный парсер, расширяющий парсер XPath. Я сделал что-то подобное с JsonPath Parser. В функции разбора выполняется функция json_decode, которая преобразует источник в массив, а затем этот массив запрашивается, поэтому вы можете вставить свой код после вызова json_decode и перед фактическим анализом, чтобы изменить полученные данные, в вашем случае, удалите элементы массива, не соответствующие вашим потребностям. Вы должны выяснить, как это сделать с помощью XPath Parser, но рабочий процесс не должен быть таким уж другим. Если у вас есть такая возможность, просто расширьте класс Xpath Parser и делайте свои вещи в методе parse. Вот что я сделал, надеюсь, это поможет вам.
$array = json_decode($raw, TRUE);
// Support JSON lines format.
if (!is_array($array)) {
$raw = preg_replace('/}\s*{/', '},{', $raw);
$raw = '[' . $raw . ']';
$array = json_decode($raw, TRUE);
}
//ARRAY MODIFICATION - FIND THE ACTUAL VERSION AMENDMENT AND MOVE THEIR CONTENTS TO THE ROOT NODE
$fields_to_move = array("fullText","sameAs","memo","lawSection","actClause","currentCommittee","coSponsors","multiSponsors","uniBill","stricken","lawCode");
foreach ($array["result"]["items"] as &$item_result){
if($item_result["activeVersion"]=="")
foreach ($fields_to_move as $field_name)
$item_result[$field_name] = $item_result["amendments"]["items"][""][$field_name];
else foreach ($item_result["amendments"]["items"] as $item)
if($item["version"] == $item_result["activeVersion"]){
foreach ($fields_to_move as $field_name)
$item_result[$field_name] = $item[$field_name];
break;
}
}
//END OF ARRAY MODIFICATION
if (is_array($array)) {
require_once drupal_get_path('module', 'feeds_jsonpath_parser').'/jsonpath-0.8.1.php';
//more stuff
}