Drupal Feeds - 在导入之前解析XML

时间:2014-08-06 11:08:37

标签: xml drupal drupal-7 drupal-feeds

我有这个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>

让feed模块创建包含有用数据的两个节点。 但是我发现使用feed模块没有任何方法也没有用它。

1 个答案:

答案 0 :(得分:0)

扩展XPath Parser的自定义解析器。我用JsonPath Parser做了类似的事情。在parse函数中,json_decode函数发生并将源转换为数组,之后,查询该数组,因此您可以在json_decode调用之后和实际解析之前插入代码以修改检索到的数据,在您的情况下,删除不符合您需求的数组项。 您必须弄清楚如何使用XPath Parser执行此操作,但工作流程不应该如此不同。如果你有机会,只需扩展Xpath Parser类并用解析方法完成你的工作。 这就是我所做的,希望它对你有所帮助。

$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
}