dongwei2882 2016-06-23 16:55
浏览 117
已采纳

PHP + XPath在指定日期之间获取节点值

My XML file looks like :

<record>
    <name>John</name>
    <StartDate>01-05-2016</StartDate>
    <EndDate>30-10-2016</EndDate>
</record>
<record>
    <name>Jerry</name>
    <StartDate>29-04-2016</StartDate>
    <EndDate>30-06-2016</EndDate>
</record>
<record>
    <name>Mike</name>
    <StartDate>05-06-2016</StartDate>
    <EndDate>25-08-2016</EndDate>
</record>

I have Two Dates Say :

start date: 30-04-2016 and,
end date: 27-08-2016

I want to write a Xpath Query which will return all the record which have <StartDate> and <EndDate> In between the above two dates(Both Inclusive).

  • 写回答

3条回答 默认 最新

  • douye9822 2016-06-23 18:01
    关注

    You can parse data and add to an array, as a stdClass or whatever you like most:

    <?php
    
    $xml =
        '<root>
            <record>
                <name>John</name>
                <StartDate>01-05-2016</StartDate>
                <EndDate>30-10-2016</EndDate>
            </record>
            <record>
                <name>Jerry</name>
                <StartDate>29-04-2016</StartDate>
                <EndDate>30-06-2016</EndDate>
            </record>
            <record>
                <name>Mike</name>
                <StartDate>05-06-2016</StartDate>
                <EndDate>25-08-2016</EndDate>
            </record>
        </root>';
    
    $doc= new DOMDocument();
    $doc->loadXML($xml);
    $xpath = new DOMXpath($doc);
    $elements = $xpath->query("//record");
    
    $output = [];
    
    $format = 'd-m-Y';
    $startDate = DateTime::createFromFormat($format, '30-04-2016');
    $endDate = DateTime::createFromFormat($format, '27-08-2016');
    
    foreach($elements as $element) {
        $elementStartDate = DateTime::createFromFormat($format, $element->getElementsByTagName("StartDate")->item(0)->nodeValue);
        $elementEndDate = DateTime::createFromFormat($format, $element->getElementsByTagName("EndDate")->item(0)->nodeValue);
    
        if( ($startDate <= $elementStartDate) &&
            ($endDate >= $elementEndDate)) {
            $obj = new stdClass;
            $obj->name = $element->getElementsByTagName("name")->item(0)->nodeValue;
            $obj->startDate = $element->getElementsByTagName("StartDate")->item(0)->nodeValue;
            $obj->endDate = $element->getElementsByTagName("EndDate")->item(0)->nodeValue;
            $output[] = $obj;
        }
    }
    
    var_dump($output);
    

    Output

    array(1) {
      [0]=>
      object(stdClass)#10 (3) {
        ["name"]=>
        string(4) "Mike"
        ["startDate"]=>
        string(10) "05-06-2016"
        ["endDate"]=>
        string(10) "25-08-2016"
      }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?