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条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?