php循环通过xml兄弟一次匹配兄弟然后移动到下一个

时间:2013-02-02 21:48:49

标签: php xpath xml-parsing simplexml

按日期列出xml siblngs。由于每个日期的时间不同,每个日期可能会多次列出。比如...

已编辑:已添加XML

<?xml version="1.0"?>
<theaterxml>
<theatreid>12345</theatreid>-
<filmtitle>
    <name>Movie Name 1</name>
    <shortname>MOVIENAME1</shortname>
    <rating>R</rating>
    <length>101</length>
    <show>
        <screen>1</screen>
        <date>02022013</date>
        <time>1205</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02022013</date>
        <time>1305</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02022013</date>
        <time>1605</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02032013</date>
        <time>1205</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02032013</date>
        <time>1305</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02032013</date>
        <time>1605</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02042013</date>
        <time>1205</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02042013</date>
        <time>1305</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02042013</date>
        <time>1605</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show> 
</filmtitle>
<filmtitle>
    <name>Movie Name 2</name>
    <shortname>MOVIENAME2</shortname>
    <rating>R</rating>
    <length>101</length>
    <show>
        <screen>1</screen>
        <date>02022013</date>
        <time>1205</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02022013</date>
        <time>1305</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02022013</date>
        <time>1605</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02032013</date>
        <time>1205</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02032013</date>
        <time>1305</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02032013</date>
        <time>1605</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02042013</date>
        <time>1205</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02042013</date>
        <time>1305</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show>
    <show>
        <screen>1</screen>
        <date>02042013</date>
        <time>1605</time>
        <salelink>http://mysite.com/foo?linkToThisTimeAndDate=999</salelink>
    </show> 
</filmtitle>

当我使用foreach到达主xml的日期子时,我只得到第一个日期。当我使用while循环时,它会显示每个日期的每次出现,直到没有更多日期。

我需要做的是运行一个while循环,显示每个日期一次,然后是下一个不同的日期,直到不再有。然后,在while循环中我需要另一个显示该日期的每次,直到没有更多。我需要能够通过使用$ _GET ['date']和?date = 01022013的url来决定显示哪个日期和时间。

我希望这是有道理的。我在手机上输入此内容,现在无法访问我的PC来复制/粘贴实际代码或xml。

编辑:现在在PC上

这似乎是很多xml,但这只是一个片段。完整的xml显示8到13部电影,每天2到5次,有时超过3周。每次都要加载它会变得非常沉重。现在我正在使用simplexml,但更愿意使用xmlreader。

今天xml是97.6KB。每次有人进入一个页面,选择其中一个日期,然后转到另一个页面等,在这个和图像之间拉,这是很多东西,这是每次点击一个页面时显示单个页面的大量数据或改变。特别是在慢速连接,移动等方面。

现在我在这个项目的枪口下,并试图进一步学习/重新学习这使我更加落后。我个人鄙视xml,并希望他们的内部软件在mysql数据库中构建它,但这是我必须使用的。此外,设计这个的公司也可以更好地构建它。

1 个答案:

答案 0 :(得分:0)

你在寻找这样的东西:

// create a DOM document and load your xml (as string)
$document = new DOMDocument();
$document->loadXML($xml);

// create a xpath selector for the document
$selector = new DOMXPath($document);

// get all show elements
$showResult = $selector->query('//show');

// dates will contain the results
$dates = array();
foreach($showResult as $show) {
    // get the date sub node 
    $dateResult = $selector->query('date', $show);
    if(count($dateResult) !== 1) {
        die('bad xml');
    }
    $date = $dateResult->item(0)->nodeValue;

    // get the time sub node 
    $timeResult = $selector->query('time', $show);
    if(count($timeResult) !== 1) {
        die('bad xml');
    }
    $time = $timeResult->item(0)->nodeValue;

    // if it is the first the time the date appears
    // we create an empty array for this index. The 
    // array will contain the timestamps
    if(!isset($dates[$date])) {
        $dates[$date] = array();
    }

    // add time to array if the same does not exists
    if(!in_array($time, $dates[$date], TRUE)) {
        $dates[$date][] = $time;
    }
}

// get all dates and times
var_dump($dates);

// get times for 02022013
var_dump($dates['02022013']);