使用php迭代不同的DOM节点和元素

使用php迭代不同的DOM节点和元素,php,html,xml,string,dom,Php,Html,Xml,String,Dom,我正试图根据时间条件制作一份时事通讯。我将一个XML文件加载到DOM文档中 <?xml version="1.0"?> <users> <user><mail>sandro.calzada@gmail.com</mail><time>1387814834</time></user><user> <mail>b4bp_22@hotmail.com</mail&g

我正试图根据时间条件制作一份时事通讯。我将一个XML文件加载到DOM文档中

<?xml version="1.0"?>
<users>
<user><mail>sandro.calzada@gmail.com</mail><time>1387814834</time></user><user>       <mail>b4bp_22@hotmail.com</mail><time>1387814834</time></user></users>

桑德罗。calzada@gmail.com1387814834b4bp_22@hotmail.com1387814834
我希望遍历所有的“time”标记,并从每个“mail”标记中获取字符串形式的值

$itm = 0;

require_once('functions.php');

$data = new DOMDocument();

$data->load('data.xml');

$times = $data->getElementsByTagName('time');

$timestamp = time();
$timestamp1 = $timestamp;
$timestamp = $timestamp-1;

foreach($times as $t)

{

    if($t->nodeValue > $timestamp)

    {
    $itm = $itm+1;
    }

    else if($t->nodeValue < $timestamp)

{

$t->nodeValue = $timestamp1;

$email1 = $data->getElementsByTagName('mail')->item($itm);

$email = strval($email1);

$itm = $itm+1;

$to = $email;

$unsub = base64_encode($email);
这是我第一次尝试。我不知道为什么我在这里失败了,但似乎迭代在一段时间内运行良好,但将邮件放在一边

    $data = new DOMDocument();

$data->load('data.xml');

$times = $data->getElementsByTagName('time');
$emails = $data->getElementsByTagName('mail');

$timestamp = time();
$timestamp1 = $timestamp;
$timestamp = $timestamp-1;

foreach($times as $t)

{

    if($t->nodeValue > $timestamp)

    {

    }

    else if($t->nodeValue < $timestamp)

{

$t->nodeValue = $timestamp1;

$email = $emails->nodeValue;

$to = $email;
$data=newDOMDocument();
$data->load('data.xml');
$times=$data->getElementsByTagName('time');
$emails=$data->getElementsByTagName('mail');
$timestamp=time();
$timestamp 1=$timestamp;
$timestamp=$timestamp-1;
foreach($t的倍)
{
如果($t->nodeValue>$timestamp)
{
}
else if($t->nodeValue<$timestamp)
{
$t->nodeValue=$timestamp1;
$email=$emails->nodeValue;
$to=$email;
这是我的第二次尝试。这里的问题是$email无法转换为字符串

$itm = 0;

require_once('functions.php');

$data = new DOMDocument();

$data->load('data.xml');

$times = $data->getElementsByTagName('time');

$timestamp = time();
$timestamp1 = $timestamp;
$timestamp = $timestamp-1;

foreach($times as $t)

{

    if($t->nodeValue > $timestamp)

    {
    $itm = $itm+1;
    }

    else if($t->nodeValue < $timestamp)

{

$t->nodeValue = $timestamp1;

$email1 = $data->getElementsByTagName('mail')->item($itm);

$email = strval($email1);

$itm = $itm+1;

$to = $email;

$unsub = base64_encode($email);
$itm=0;
一次需要_('functions.php');
$data=新的DOMDocument();
$data->load('data.xml');
$times=$data->getElementsByTagName('time');
$timestamp=time();
$timestamp 1=$timestamp;
$timestamp=$timestamp-1;
foreach($t的倍)
{
如果($t->nodeValue>$timestamp)
{
$itm=$itm+1;
}
else if($t->nodeValue<$timestamp)
{
$t->nodeValue=$timestamp1;
$email1=$data->getElementsByTagName('mail')->item($itm);
$email=strval($email1);
$itm=$itm+1;
$to=$email;
$unsub=base64_编码($email);

有什么办法吗?谢谢你的帮助!

for循环可能更合适:

$times = $data->getElementsByTagName('time');
$emails = $data->getElementsByTagName('mail');

for ($i=0; $i < $times->length; $i++) { 
    $ts = (string) $times->item(0)->nodeValue;
    if ( $ts < time()-1 ) {
        $times->item(0)->nodeValue = $ts;
        $email = $emails->item(0)->nodeValue;
    }
}
$times=$data->getElementsByTagName('time');
$emails=$data->getElementsByTagName('mail');
对于($i=0;$i<$times->length;$i++){
$ts=(字符串)$times->item(0)->nodeValue;
如果($tsitem(0)->nodeValue=$ts;
$email=$email->item(0)->nodeValue;
}
}

我认为这样会更具可读性:

<?php
$x='<?xml version="1.0"?>
<users>
<user><mail>sandro.calzada@gmail.com</mail><time>1387814834</time></user>
<user>       <mail>b4bp_22@hotmail.com</mail><time>1387814834</time></user></users>';
$doc = new DOMDocument();
$doc->loadXML($x);

foreach ($doc->getElementsByTagName('user') as $user){
   $mails = $user->getElementsByTagName('mail');
   $times = $user->getElementsByTagName('time');
   print $mails->item(0)->nodeValue. "-". $times->item(0)->nodeValue ."\n";
}
loadXML($x);
foreach($doc->getElementsByTagName('user')作为$user){
$mails=$user->getElementsByTagName('mail');
$times=$user->getElementsByTagName('time');
打印$mails->item(0)->nodeValue.-“$times->item(0)->nodeValue.\n”;
}

您可以在这里尝试:

我修改了Amal代码,这正是我所需要的

    $times = $data->getElementsByTagName('time');
$emails = $data->getElementsByTagName('mail');

$timestamp = time();

for ($i=0; $i < $times->length; $i++) { 
$ts = (string) $times->item($i)->nodeValue;
if ( $ts < $timestamp-1 ) {
    $times->item($i)->nodeValue = $timestamp;
    $email = $emails->item($i)->nodeValue;

$to = $email;
$times=$data->getElementsByTagName('time');
$emails=$data->getElementsByTagName('mail');
$timestamp=time();
对于($i=0;$i<$times->length;$i++){
$ts=(字符串)$times->item($i)->nodeValue;
如果($ts<$timestamp-1){
$times->item($i)->nodeValue=$timestamp;
$email=$emails->item($i)->nodeValue;
$to=$email;

您希望以字符串的形式访问XML元素(可能还有属性)。您选择了PHP的
DOMDocument
库来解析XML。不仅PHP使用,许多其他人也使用它,例如Mozilla

要使用DOMDocument获取元素的字符串值,需要访问
domeElement
对象(PHP:
domeElement::$nodeValue
)的
nodeValue
属性,该对象实际上是
DOMNode
(PHP:)as
domeElement
DOMNode
的一个子类型。PHP手册介绍了
nodeValue

节点值
此节点的值,取决于其类型

按类型这意味着如果类型是
domeElement
(与您的情况相同),它将包含您要查找的字符串

因此,您所需要做的就是查询所有在时间元素之前的电子邮件元素,这些时间元素比要比较的时间更大(在我的示例中,我将其翻过来:更低):

$doc = new DOMDocument;
$doc->loadXML($xml);
$xpath = new DOMXpath($doc);

$expr  = sprintf(
    '//user/time[number(.) < %d]/preceding-sibling::mail[last()]'
    , time()
);
echo '"', $expr, "\" :\n";

$emails = $xpath->query($expr);
foreach($emails as $email) {
    echo ' * ', $email->nodeValue, "\n";
}
演示如下:


对于您的问题中的XML,使用PHP拥有的不同(但相关)XML解析器SimpleXML很可能更容易访问。请与以下示例进行比较:

$doc = simplexml_load_string($xml);

$expr  = sprintf(
    '//user/time[number(.) < %d]/preceding-sibling::mail[last()]'
    , time()
);

$emails = $doc->xpath($expr);
foreach($emails as $email) {
    echo ' * ', $email, "\n";
}
$doc=simplexml\u load\u字符串($xml);
$expr=sprintf(
“//user/time[number(.)<%d]/前面的同级::mail[last()]”
,时间()
);
$emails=$doc->xpath($expr);
foreach($email作为$email){
回显“*”,$email,“\n”;
}
如本例所示,SimpleXML提供了神奇的
\uuuu toString()
方法,以便电子邮件的元素对象在与
echo
一起使用时自动转换为字符串

演示在这里:

只缺少item()内的索引:p,但这是解决方案,非常感谢