【问题标题】:flow control depending on value of xml element流控制取决于 xml 元素的值
【发布时间】:2012-09-10 21:54:04
【问题描述】:

我有一个包含 500 多个项目的长 xml 数据文件,它采用以下形式:

<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>
<ITEM>
    <TITLE>ITEM name</TITLE>
    <TYPE>TYPE </TYPE>
    <DESCIPTION>DESCIPTIONiliate Page CPM</DESCIPTION>
    <PRICE>PRICE</PRICE>
    <ITEM>http://mysite.com/item-link</ITEM>
</ITEM>
</CATALOG>

我在php页面中使用以下代码从xml文件中导入数据:

<?php
$ITEMSS = new SimpleXMLElement('ITEMS.xml', null, true);

echo <<<EOF
<table width="100%" align="center" border="1" bordercolor="#0099ff" cellpadding="1" cellspacing="0">

    <tr>
            <th bgcolor="#66ccff"><span class="style4">ITEM Name</span></th>
            <th bgcolor="#66ccff"><span class="style4">item TYPE </span></th>
            <th bgcolor="#66ccff"><span class="style4">item DESCIPTION </span></th>
            <th bgcolor="#66ccff"><span class="style4">item PRICE</span></th>
            <th bgcolor="#66ccff"><span class="style4">link to item</span></th>
    </tr>

EOF;
foreach($ITEMSS as $ITEMS) // loop through our DATAS
{
    echo <<<EOF
    <tr height="30" align=middle>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td>
            <td><span class="STYLE8">{$ITEMS->TYPE}</span></td>
            <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td>
            <td><span class="STYLE8">{$ITEMS->PRICE}</span></td>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td>
    </tr>

EOF;
}
echo '</table>';
?>

我需要在循环中添加一个“if”语句来只选择一些数据,如果“TYPE”有一定的值,它会显示该数据,如果没有它会跳过它。

还需要添加分页系统,因为要列出 500 多个项目,我希望表格显示最少项目数,例如 25。

谢谢大家的帮助!

【问题讨论】:

  • 不客气,但我不明白我必须做什么。
  • 请判断你的头部using “if” in php from xml
  • 感谢 Fluffeh 我解决了“if”问题,现在我需要添加分页系统以每页仅显示 25 个项目

标签: php xml


【解决方案1】:

作为替代方案,您可以通过xpath 仅选择(并处理)在 TYPE 元素中具有特定文本值的那些 ITEM 元素,例如

<?php
$doc = new SimpleXmlElement(getData());
foreach($doc->xpath("//ITEM[TYPE='A']") as $item) {
    echo $item->DESCIPTION, "\n";
}

function getData() {
    return <<< eox
<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>
<ITEM>
    <TITLE>item 1</TITLE>
    <TYPE>A</TYPE>
    <DESCIPTION>desc1</DESCIPTION>
    <PRICE>price1</PRICE>
    <ITEM>item1-link</ITEM>
</ITEM>
<ITEM>
    <TITLE>item x</TITLE>
    <TYPE>B</TYPE>
    <DESCIPTION>descx</DESCIPTION>
    <PRICE>pricex</PRICE>
    <ITEM>itemx-link</ITEM>
</ITEM>
<ITEM>
    <TITLE>item y</TITLE>
    <TYPE>B</TYPE>
    <DESCIPTION>descy</DESCIPTION>
    <PRICE>pricey</PRICE>
    <ITEM>itemy-link</ITEM>
</ITEM>
<ITEM>
    <TITLE>item 2</TITLE>
    <TYPE>A</TYPE>
    <DESCIPTION>desc2</DESCIPTION>
    <PRICE>price2</PRICE>
    <ITEM>item2-link</ITEM>
</ITEM>
</CATALOG>
eox;
}

打印

desc1
desc2

-- 编辑:带有一些分页功能--

<?php
define('ITEMS_PER_PAGE', 10);
$page = 1; // =intval($_GET['page']);

$posMin = $page*ITEMS_PER_PAGE;
$posMax = ($page+1)*ITEMS_PER_PAGE;
$doc = new SimpleXmlElement(getData());
foreach($doc->xpath("(//ITEM[TYPE='A'])[position()>=$posMin and position()<$posMax]") as $item) {
    echo $item->DESCIPTION, "\n";
}

function getData() {
    $xml = '<?xml version="1.0" encoding="ISO-8859-1"?>
<CATALOG>';
    for($i=0; $i<100; $i++) {
        $type = 0===$i%2 ? 'A':'B';
        $xml .= "   
        <ITEM>
        <TITLE>item $i</TITLE>
        <TYPE>$type</TYPE>
        <DESCIPTION>desc $i</DESCIPTION>
        <PRICE>price $i</PRICE>
        <ITEM>item{$i}-link</ITEM>
        </ITEM>";
    }
    $xml.='</CATALOG>';
    return $xml;
}

函数 getData() 只是一些返回一些 xml 数据的样板。
要了解 xpath 查询,请阅读(好的)xpath 教程,请参阅例如Using XPATH to access XML elements (was: Good tutorial to learn xpath)

【讨论】:

  • 我不明白,我应该在哪里包含xml文件来获取数据,我应该把那个代码放在哪里来选择一些数据并创建一个分页系统?
  • 这是一个独立的示例,可以进行复制和粘贴评估。这不是“在这里和这里剪掉然后放在那里”的代码块。
  • 我有一个小问题,如果我每页最多显示 5 个项目,则在第一页它只显示 4 个项目,然后从下一页开始显示 5 个项目,我还添加了“下一个”和“上一页”显示下一页和上一页,但不知道如何停在最后一页,它一直在上升,而对于“上一页”,它一直在下降,直到它显示页面的-1!
【解决方案2】:

您可以这样添加循环:

foreach($ITEMSS as $ITEMS) // loop through our DATAS
{
    if($ITEMS->TYPE=="BoogeyWoogey")
    {
        echo <<<EOF
        <tr height="30" align=middle>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td>
            <td><span class="STYLE8">{$ITEMS->TYPE}</span></td>
            <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td>
            <td><span class="STYLE8">{$ITEMS->PRICE}</span></td>
            <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td>
        </tr>

EOF;
    }
}

假设您正在循环通过 foreach 并且只想在 $ITEMS-&gt;TYPE 属性中包含值 BoogeyWoogey 时显示。

分页部分不会相当那么简单。

你可以这样做:

您可以这样添加循环:

$myLimit=(!empty($_REQUEST['myLimit']) ? $_REQUEST['myLimit'] : 0;
foreach($ITEMSS as $ITEMS) // loop through our DATAS
{
    for($i=$myLimit;$i<$myLimit+25;$i++)
    {
        if($ITEMS->ITEM=="BoogeyWoogey")
        {
            echo <<<EOF
            <tr height="30" align=middle>
                <td><a href="{$ITEMS->ITEM}" target="_blank"><span class="STYLE7">{$ITEMS->TITLE}</span></a></td>
                <td><span class="STYLE8">{$ITEMS->TYPE}</span></td>
                <td><span class="STYLE8">{$ITEMS->DESCIPTION}</span></td>
                <td><span class="STYLE8">{$ITEMS->PRICE}</span></td>
                <td><a href="{$ITEMS->ITEM}" target="_blank"><B><span class="STYLE7">cHECK IT OUT</span></B></a></td>
            </tr>

            EOF;
        }
    }
}

但是您需要通过$GET$_POST 将变量$myLimit 传递给页面以在循环中使用它。 (随意更改它以使用 $_SESSION 或其他任何适合您的方式 - 我认为在链接中使用变量是最简单的,所以很可能 $GET 应该可以解决问题。

【讨论】:

  • 非常感谢,它非常适合“if”部分,现在我需要分页部分,如何在页面中列出项目,比如 site/item.php?page=1 等等每页最多列出 25 个
  • “现在我需要分页部分”——这是一个新问题。
  • @VolkerK 好吧,他确实在原文中问过,此外,我已经以一种拍打的方式编写了代码:)
  • 该死......现在我也必须修改我的答案:)
  • 它已经包含在第一个问题中,但我刚刚得到了第一部分的答案,女巫是“如果”部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-03
  • 1970-01-01
  • 2011-12-25
  • 2016-11-16
  • 2017-06-12
  • 1970-01-01
  • 2012-08-01
相关资源
最近更新 更多