使用PHP获取xml文件中的信息。如何在未来缩短和扩展?

时间:2013-12-05 00:36:10

标签: php xml xpath

这些是我所做的工作代码。该程序是基于从表单提交的组和团队编号访问xml文件中的信息,例如学生的姓名,ID和标记。如果单击一个按钮,则有2个提交按钮,它将显示一个附加元素(pic),另一个没有它。到目前为止一切顺利。

但是看看php代码,我知道如果有很多团队和团队号码,我将面临问题。会有很多if-else语句,代码会很长。我尝试过使用foreach但是我没有得到我想要的结果。反正有没有简化这个?我一直在网上搜索,但似乎我只是不知道如何实现它们。对此非常陌生。

<html><style>
    .datagrid table { border-collapse: collapse; text-align: center; width: 100%; }
    .datagrid {font: normal 12px/150% Arial, Helvetica, sans-serif; 
               background: #fff; 
               overflow: hidden; 
               border: 4px solid #006699; 
               -webkit-border-radius: 20px; 
               -moz-border-radius: 20px; 
               border-radius: 20px; }
    .datagrid table td, .datagrid table th { padding: 7px 20px; }
    .datagrid table thead th {background:-webkit-gradient( linear, left top, left bottom, color-stop(0.05, #006699), color-stop(1, #00557F) );
                              background:-moz-linear-gradient( center top, #006699 5%, #00557F 100% ); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#006699', endColorstr='#00557F');
                              background-color:#006699; color:#FFFFFF; font-size:15px; font-weight:bold;
                              border-left: 1px solid #0070A8; } 
    .datagrid table thead th:first-child { border: none; }
    .datagrid table tbody td { color: #00496B; border-left: 1px solid #E1EEF4;font-size: 13px;font-weight: normal; }
    .datagrid table tbody .alt td { background: #E1EEF4; color: #00496B; }
    .datagrid table tbody td:first-child { border-left: none; }
    .datagrid table tbody tr:last-child td { border-bottom: none; }
</style>
<center>
<form action="" method="post" >
    <select name="group">
        <option value="csa">CSA</option>
        <option value="csb">CSB</option>
    </select>

    Enter team number:<input type="text" name="teamnum" value="">

    <input type="submit" name="submit1"  value="With Photo">
    <input type="submit" name="submit2"  value="Without Photo">
</form>
<form action="index.php">
    <input type="submit" value="main">
</form>
</center>
</html>

<?php
if (isset($_POST['submit1']) != '') {

$file = "student.xml";
$xml = simplexml_load_file($file) or die("Unable to load XML file!");
if (isset($_POST['group']) && isset($_POST['teamnum']) != '') {
    $teamnum = $_POST['teamnum'];
    $group = $_POST['group'];

    if ($group == 'csa' && $teamnum == '1') {
        $name = $xml->xpath('//student[teamNum[contains(text(),"1")] and group[contains(text(),"CSA")]]/name');
        $id = $xml->xpath('//student[teamNum[contains(text(),"1")] and group[contains(text(),"CSA")]]/id');
        $total = $xml->xpath('//student[teamNum[contains(text(),"1")] and group[contains(text(),"CSA")]]/total');
        //$photo =$xml->xpath('//student[teamNum[contains(text(),"1")] and group[contains(text(),"CSA")]]/pic');

        echo "<div class='datagrid'><table border='1' cellpadding='1'>";
        echo "<thead><tr><th>Photo</th><th>Name</th><th>ID</th><th>carry marks</th></tr></thead>";
        while ((list(, $node) = each($name)) && (list(, $node1) = each($id)) && (list(, $node2) = each($total))) {
            echo "<tbody><tr class='alt'>";
            echo "<td>1</td>";
            echo "<td>$node</td>";
            echo "<td>$node1</td>";
            echo "<td>$node2</td>";
            echo "</tr>";
        }
        echo "</tbody></table></div>";
    }
    else if ($group == 'csa' && $teamnum == '2') {
        $name = $xml->xpath('//student[teamNum[contains(text(),"2")] and group[contains(text(),"CSA")]]/name');
        $id = $xml->xpath('//student[teamNum[contains(text(),"2")] and group[contains(text(),"CSA")]]/id');
        $total = $xml->xpath('//student[teamNum[contains(text(),"2")] and group[contains(text(),"CSA")]]/total');
        //$photo =$xml->xpath('//student[teamNum[contains(text(),"2")] and group[contains(text(),"CSA")]]/pic');

        echo "<div class='datagrid'><table border='1' cellpadding='1'>";
        echo "<thead><tr><th>Photo</th><th>Name</th><th>ID</th><th>carry marks</th></tr></thead>";
        while ((list(, $node) = each($name)) && (list(, $node1) = each($id)) && (list(, $node2) = each($total))) {
            echo "<tbody><tr class='alt'>";
            echo "<td>1</td>";
            echo "<td>$node</td>";
            echo "<td>$node1</td>";
            echo "<td>$node2</td>";
            echo "</tr>";
        }
        echo "</tbody></table></div>";
    }
else if (isset($_POST['submit2']) != '') {

$file = "student.xml";
$xml = simplexml_load_file($file) or die("Unable to load XML file!");
if (isset($_POST['group']) && isset($_POST['teamnum']) != '') {
    $teamnum = $_POST['teamnum'];
    $group = $_POST['group'];
    if ($group == 'csa' && $teamnum == '1') {
        $name = $xml->xpath('//student[teamNum[contains(text(),"1")] and group[contains(text(),"CSA")]]/name');
        $id = $xml->xpath('//student[teamNum[contains(text(),"1")] and group[contains(text(),"CSA")]]/id');
        $total = $xml->xpath('//student[teamNum[contains(text(),"1")] and group[contains(text(),"CSA")]]/total');

        echo "<div class='datagrid'><table border='1' cellpadding='1'>";
        echo "<thead><tr><th>Name</th><th>ID</th><th>carry marks</th></tr></thead>";
        while ((list(, $node) = each($name)) && (list(, $node1) = each($id)) && (list(, $node2) = each($total))) {
            echo "<tbody><tr class='alt'>";
            echo "<td>$node</td>";
            echo "<td>$node1</td>";
            echo "<td>$node2</td>";
            echo "</tr>";
        }
        echo "</tbody></table></div>";
    }
    else if ($group == 'csa' && $teamnum == '2') {
        $name = $xml->xpath('//student[teamNum[contains(text(),"2")] and group[contains(text(),"CSA")]]/name');
        $id = $xml->xpath('//student[teamNum[contains(text(),"2")] and group[contains(text(),"CSA")]]/id');
        $total = $xml->xpath('//student[teamNum[contains(text(),"2")] and group[contains(text(),"CSA")]]/total');

        echo "<div class='datagrid'><table border='1' cellpadding='1'>";
        echo "<thead><tr><th>Name</th><th>ID</th><th>carry marks</th></tr></thead>";
        while ((list(, $node) = each($name)) && (list(, $node1) = each($id)) && (list(, $node2)= each($total))) {
            echo "<tbody><tr class='alt'>";
            echo "<td>$node</td>";
            echo "<td>$node1</td>";
            echo "<td>$node2</td>";
            echo "</tr>";
        }
        echo "</tbody></table></div>";
    }
?>

1 个答案:

答案 0 :(得分:0)

我找到了使用foreach解决这个问题的方法

<?php
if (isset($_POST['submit1']) != '') {

$file = "student.xml";
$xml = simplexml_load_file($file) or die("Unable to load XML file!");
if (isset($_POST['group']) && isset($_POST['teamnum']) != '') {
    $teamnum = $_POST['teamnum'];
    $group = $_POST['group'];

    echo "<div class='datagrid'><table border='1' cellpadding='1'>";
    echo "<thead><tr><th>Photo</th><th>Name</th><th>ID</th><th>carry marks</th></tr></thead>";
    echo "<tbody>";
    foreach ($xml->xpath("//student[contains(teamNum, $teamnum) and contains(group, $group)]") as $student) {

        echo "<tr class='alt'>";  
        echo "<td>".$student->picture."</td>";
        echo "<td>".$student->name."</td>";
        echo "<td>".$student->id."</td>";
        echo "<td>".$student->total."</td>";
        echo "</tr>";
    } 
echo "</tbody></table></div>";
    }else            echo 'no data';

} else {
    echo "enter a team's number";    
}

?>

技巧在xpath中。它会选择包含已提交值的所有学生。之后,它将作为$ student,我将能够从那里输出元素值。