【问题标题】:Drupal Feeds - Parse XML before importingDrupal Feeds - 在导入之前解析 XML
【发布时间】:2014-08-06 11:08:36
【问题描述】:

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

并让提要模块创建两个具有有用数据的节点。 但我发现没有办法也没有有用的钩子可以用 feeds 模块做到这一点。

【问题讨论】:

    标签: xml drupal drupal-7 drupal-feeds


    【解决方案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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多