【问题标题】:XML data to HTML with PHP使用 PHP 将 XML 数据转换为 HTML
【发布时间】:2016-07-04 18:24:11
【问题描述】:

我有以下函数显示来自 xml 文件的信息:

<?php
function adddata(){
$dir = plugin_dir_path(__FILE__);
$file = $dir.'visits.xml';
$xml = simplexml_load_file($file);
$data = $xml->xpath('/VISITORS/VISIT');
foreach($data as $visit){
echo '<tr>';
echo '<td>'. $visit->EMAIL.'</td>';
echo '<td>'. $visit->PHONE.'</td>';
echo '<td>'. $visit->IPADDRESS.'</td>';
echo '<td>'. $visit->HOSTNAME.'</td>';
echo '<td>'. $visit->BROWSER.'</td>';
echo '<td>'. $visit->CURRENTPAGE.'</td>';
echo '<td>'. $visit->REFERER.'</td>';
echo '<td>'. $visit->GPS.'</td>';
echo '<td>'. $visit->ISP.'</td>';
echo '<td>'. $visit->CITY.'</td>';
echo '<td>'. $visit->STATE.'</td>';
echo '<td>'. $visit->COUNTRY.'</td>';
echo '<td>'. $visit->TIME.'</td>';
echo '</tr>';               
}
}
?>

这是xml文件:

<?xml version="1.0" encoding="UTF-8"?>
    <VISITORS>
        <VISIT>
            <IPADDRESS>173.16.185.54</IPADDRESS>
            <EMAIL></EMAIL>
            <PHONE>515-123-1234</PHONE>
            <CURRENTPAGE>http://www.example.com/example.php</CURRENTPAGE>
            <REFERER>http://www.google.com</REFERER>
            <HOSTNAME>173-16-185-54.client.mchsi.com</HOSTNAME>
            <BROWSER>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36</BROWSER>
            <ISP>AS30036 Mediacom Communications Corp</ISP>
            <GPS>37.2999,-93.3084</GPS>
            <CITY>Springfield</CITY>
            <STATE>Missouri</STATE>
            <COUNTRY>US</COUNTRY>
            <TIME>Thursday, June 30, 2016 16:14:43</TIME>
        </VISIT>
        <VISIT>
            <IPADDRESS>173.16.185.54</IPADDRESS>
            <EMAIL>example@example.com</EMAIL>
            <PHONE>515-123-1234</PHONE>
            <CURRENTPAGE>http://www.example.com/example2.php</CURRENTPAGE>
            <REFERER>https://facebook.com/</REFERER>
            <HOSTNAME>173-16-185-54.client.mchsi.com</HOSTNAME>
            <BROWSER>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36</BROWSER>
            <ISP>AS30036 Mediacom Communications Corp</ISP>
            <GPS>37.2999,-93.3084</GPS>
            <CITY>Springfield</CITY>
            <STATE>Missouri</STATE>
            <COUNTRY>US</COUNTRY>
            <TIME>Thursday, June 30, 2016 16:17:33</TIME>
        </VISIT>
        <VISIT>
            <IPADDRESS>202.46.13.63</IPADDRESS>
            <EMAIL></EMAIL>
           <PHONE></PHONE>
            <CURRENTPAGE>http://www.example.com/example4.php</CURRENTPAGE>
            <REFERER></REFERER>
            <HOSTNAME>msnbot-202-46-13-63.search.msn.com</HOSTNAME>
            <BROWSER>Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)</BROWSER>
            <ISP>AS8075 Microsoft Corporation</ISP>
            <GPS>41.8500,-87.6500</GPS>
            <CITY>Chicago</CITY>
            <STATE>Illinois</STATE>
            <COUNTRY>US</COUNTRY>
            <TIME>Thursday, June 30, 2016 16:17:36</TIME>
        </VISIT>
        <VISIT>
            ... More Visits ...
        </VISIT>
        <VISIT>
            ... More Visits ...
        </VISIT>
    </VISITORS>

请注意,前两次“访问”来自同一个 IP 地址,但只有第二次包含电子邮件地址,因为他们第一次访问该站点时,信息不可用。

如果他们来自同一个 IP 地址,我如何在包含该 IP 地址的所有表格行上显示该访问者的正确电子邮件? (我不用改xml文件,只输出数据,但我不反对改xml文件)

【问题讨论】:

    标签: php html xml


    【解决方案1】:

    如果电子邮件不为空且 ip 尚未设置为数组中的索引,您可以创建一个数组,在其中将电子邮件保存到 ip。

    那么就用ip作为索引来显示对应的email。

    尽管如此,对于每个 ip,不能​​有不同的电子邮件。但是,如果当前电子邮件与保存的电子邮件不同,您可以实施另一项检查。您也可以在每次电子邮件不为空时简单地替换数组中的电子邮件,具体取决于您要如何处理这些情况。

    function adddata() {
        $file = 'test.xml';
        $xml = simplexml_load_file($file);
        $data = $xml->xpath('/VISITORS/VISIT');
    
        $ipToMailArray = array();
        foreach ($data as $visit) {
            if(!array_key_exists((string)$visit->IPADDRESS, $ipToMailArray) && (string)$visit->EMAIL !== ''){
                $ipToMailArray[(string)$visit->IPADDRESS] = (string)$visit->EMAIL;
            }
        }
        foreach ($data as $visit) {
            echo '<tr>';
            echo '<td>' . (($ipToMailArray[(string)$visit->IPADDRESS] !== '') ? $ipToMailArray[(string)$visit->IPADDRESS] : '') . '</td>';
            echo '<td>' . $visit->PHONE . '</td>';
            echo '<td>' . $visit->IPADDRESS . '</td>';
            echo '<td>' . $visit->HOSTNAME . '</td>';
            echo '<td>' . $visit->BROWSER . '</td>';
            echo '<td>' . $visit->CURRENTPAGE . '</td>';
            echo '<td>' . $visit->REFERER . '</td>';
            echo '<td>' . $visit->GPS . '</td>';
            echo '<td>' . $visit->ISP . '</td>';
            echo '<td>' . $visit->CITY . '</td>';
            echo '<td>' . $visit->STATE . '</td>';
            echo '<td>' . $visit->COUNTRY . '</td>';
            echo '<td>' . $visit->TIME . '</td>';
            echo '</tr>';
        }
    }
    

    不过,当您在第一个循环中时,您也可以简单地用所有数据填充数组。然后只需返回数组,这样函数就不必处理您的 html 输出。 (或者也许只是重命名你的函数,以便清楚地传达这个函数应该输出一些东西)

    【讨论】:

    • 哦,谢谢。是的,所以他必须在输出数据之前对其进行迭代,这不是什么大问题。
    • @Philipp - 我在您编辑之前和之后尝试了上面的代码,现在都将电子邮件地址输出为空....(但您知道,输入的电子邮件将始终位于空电子邮件之后在xml文件中)
    • 哦该死的抱歉,必须将 SimpleXMLElement 转换为字符串。编辑。还添加了一些东西来检查电子邮件是否真的不在 xml 中,所以不会有通知
    【解决方案2】:

    如果邮件为空,可以像这样查询IPADDRESS而不是空EMAIL的节点:

    function adddata($file)
    {
        $dir = plugin_dir_path(__FILE__);
        $file = $dir . 'visits.xml';
        $xml = simplexml_load_file($file);
        $data = $xml->xpath('/VISITORS/VISIT');
        foreach($data as $visit) {
    
            if(empty($visit->EMAIL)) {
                //Select the node with the same IP and filled email
                $node = $xml->xpath("/VISITORS/VISIT[IPADDRESS/text() = '{$visit->IPADDRESS}' and EMAIL/text()]");
                if($node && count($node)) {
                    $visit->EMAIL = $node[0]->EMAIL;
                }
            }
    
            echo "-> ".$visit->EMAIL. "<br>";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多