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
}
Другие вопросы по тегам