使用php迭代不同的DOM节点和元素
我正试图根据时间条件制作一份时事通讯。我将一个XML文件加载到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 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;
如果($ts
我认为这样会更具可读性:
<?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:)asdomeElement
是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,但这是解决方案,非常感谢