1

我不确定我是否正确命名了该标题,但基本上我有一个来自 $_POST (乐队名称)的变量,我想将它插入到这样一行中的节点名称的位置 -

$lastvisits = $address->$band->getElementsByTagName("lastvisit");

$band在哪里

$band = $_POST['band']

因为 $address 中的节点实际上可以是任何名称,并且可能不存在。我确定必须有一个简单的方法,但我不确定格式。

如果它存在或不存在,$lastvisits = $address->$band>getElementsByTagName("lastvisit") 会带来一个错误-致命错误:在非对象中调用成员函数 getElementsByTagName()...

XML-

<?xml version="1.0"?>
<addresses>
<address>
    <ip>127.0.0.1</ip>
    <Beatles>
        <lastvisit>12/08/2006</lastvisit>
    </Beatles>
</address>
    <address>
    <ip>125.0.0.1</ip>
</address>
 </addresses>

这是完整的代码:

    $doc = new DOMDocument();
$doc->load("votingxml/addresses.xml");
$addresses = $doc->getElementsByTagName("address");
$band = strval($_POST['band']);
$pVoted = false;
$pFound = false;

//Loop through the addresses nodes and see if the person has voted before for each( $addresses as $address )
{

$ips = $address->getElementsByTagName("ip");
            $ip = $ips->item(0)->nodeValue;
                            if ($ip == $domain){

                $pFound = true;             
            if ($address->$band == 'NULL'){
                 $bandfound= false;
                 $newBandElement = $doc->createElement($_POST['band']);
                 $newLastVisitElement = $doc->createElement('lastvisit');
                 $dayvalue = $doc->createTextNode($today);
                 $dayvalue = $newLastVisitElement->appendChild($dayvalue);

                 $newBandElement->appendChild($newLastVisitElement);
                 $address->appendChild($newBandElement);
                 $doc->save("votingxml/addresses.xml");
                 $pVoted = false;
            }
            else{

                 $bandfound =true;
                                 $lastvisits = $address->$band->getElementsByTagName("lastvisit");
                 $lastvisit = $lastvisits->item(0)->nodeValue;

                 if ($lastvisit == $today){
                        echo "alreadyvoted";
                        $pVoted = true;
                     }else{
                    $lastvisits->item(0)->nodeValue = $today;
                    $doc->save("votingxml/addresses.xml");
                    $pVoted = false;
                     }

            }
        }
        else if ($ip != $domain)
        {
            $pFound = false;
        }

}

任何帮助将不胜感激。

4

1 回答 1

1

编辑#1:看起来您在添加的示例中指的是 DOM,而不是 SimpleXML。不过,这里是您如何使用 XML 结构处理 SimpleXML 对象的方法...

$band = $_POST['band'];

if (property_exists($address, $band)) {
    $lastvisits = $address->$band->lastvisit;
}
别的 {
    /* 处理用户传递的元素名称无效的事实 */
}

注意:只有 1 个 lastvisit 元素。如果还有更多,您需要将这些 lastvisit 元素包装到 XML 文件中的单个“lastvisits”父元素中。有效的 XML 等等。

编辑#2:您的 xml 结构存在一些问题。“披头士”太独特了,不能作为一个元素的名称。你可能想像这样改变它:

<地址>
   <地址>
      <ip>127.0.0.1</ip>
      <访问>
         <访问>
            <band>披头士乐队</band>
            <lastvisit>12/08/2006</lastvisit>
         </访问>
         <访问>
            <band>街区新来的孩子</band>
            <lastvisit>1/14/2008</lastvisit>
         </访问>
      </访问>
   </地址>
   <地址>
      <ip>24.135.9.2</ip>
      <访问>
...
      </访问>
   </地址>
</地址>

然后,您将要搜索具有要搜索ip的 IP 值的节点,然后在该band节点下搜索值“Beatles”的节点。

编辑#3、4:使用 DOMXPath 类为 DOM 添加方法以在上述 XML 结构上运行搜索,如果未找到带则添加新记录...

$band = $_POST['band'];
$client_IP = $_SERVER["REMOTE_ADDR"];
$doc = 新的 DOMDocument();
$doc->load("votingxml/addresses.xml");
$xpath = 新 DOMXPath($doc);
$ip_query = $xpath->query('//addresses/address/ip[. = "' . $client_IP . '"]');
if ($ip_query->length === 1) {
    // 找到客户端的 IP,现在抓取并使用客户端的地址记录
    $address = $ip_query->item(0)->parentNode;
    // 搜索 $address 内的访问记录以获得 band 元素 value = $band
    $band_query = $xpath->query('visits/visit/band[. = "'.$band.'"]', $address);
    if ($band_query->length === 1) {
        // $band 找到,现在获取访问父记录以获取更多详细信息
        $visit = $band_query->item(0)->parentNode;
        // 有了这个,现在对记录的 lastvisit 值做一些事情
        echo $visit->getElementsByTagName("lastvisit")->item(0)->nodeValue;
        }
    别的 {
        // 未找到 $band。向 XML 文件添加新的访问记录
        // 指向'visits'组元素
        $visits = $address->getElementsByTagName("visits")->item(0);
        // 创建一个新的 'visit' 元素,包含 'band' 和 'lastvisit' 子元素
        $visit = $doc->createElement("visit");
        $band = $doc->createElement("band", $band);
        $lastvisit = $doc->createElement("lastvisit", date("n/d/Y"));
        $visit->appendChild($band);
        $visit->appendChild($lastvisit);
        // 现在将新的 'visit' 元素添加到 'visits' 元素并保存
        $visits->appendChild($visit);
        $doc->save("votingxml/addresses.xml");
        }
    }
于 2010-11-21T23:48:02.477 回答