【问题标题】:php find xml node thanks to isset variable form url [closed]php通过isset变量形式的url找到xml节点[关闭]
【发布时间】:2013-05-18 21:21:38
【问题描述】:

我有一个单独的.php 页面,我想在其中加载单个帖子。

为此,我的 index.php 中有一些链接可以加载 single.php 页面:

<a href="single.php?blog_no=12">Post 12</a> 
<a href="single.php?blog_no=11">Post 11</a>   
<a href="single.php?blog_no=10">Post 10</a>

我在我的 single.php 页面的 url 中获取变量,我想在 xml 文件中找到(并显示)与此变量对应的元素:

<?php
if(isset($_GET["blog_no"])) {

$i = $_GET["blog_no"];

$elements = new SimpleXMLElement('data.xml', null, true);

$query = $elements->xpath(" /elements/element[@id='$i'] ");

foreach($query as $element) {

    echo $elements->element['size'];
    echo $elements->element['category'];
    echo $elements->element->title;

}
?>

这是我的 xml 文件的示例:

<elements>

<element id="12" size="square" category="portfolio">
    <tag tag="printer printing 3d apple iphone 5 bumper case"></tag>
    <icon class="icon-picture"></icon>
    <urlpage url="/contact/contact.html"></urlpage>
    <urlimage src='./Post thumbnail images/01.png'></urlimage>
    <date date="8 Apr"></date>
    <title>Minimal Bumper for iPhone 5 : Protect your iphone with a lightwheight and protect full case </title>
</element>

<element id="11" size="normal" category="portfolio">
    <tag tag="printer printing 3d apple iphone 5 case slim"></tag>
    <icon class="icon-picture"></icon>
    <urlpage url="/portfolio/11.html"></urlpage>
    <urlimage src='./Post thumbnail images/tape-dribbble.jpg'></urlimage>
    <date date="21 Jan"></date>
    <title>UltraSlim case</title>
</element>

</elements>

但没有任何效果。

【问题讨论】:

  • “但没有任何效果。” 不是有效的问题描述。在您在这里提出问题之前,请确保您已启用错误记录和报告并将其设置为最高级别,然后跟踪所有通知、警告和错误并首先修复它们。这将为您省去很多问号,因为 PHP 会告诉您问题出在哪里 - 就像您在此处的示例代码中没有执行正确的 xpath。
  • 在您最后一次编辑之后,您的代码甚至可以立即使用 (eval.in/30703)。那么你的问题是什么?
  • 这段代码当然没有任何错误,但它不能正常工作。它总是得到第一个 xml 节点...
  • 这是因为原始代码在 foreach 循环中访问原始文档的方式,而不是 xpath 查询的结果。原始代码中的问题不仅仅是变量替换。
  • 不,它得到的是您要求的节点。 foreach 也将其放入 $element,但您需要使用该变量进行输出。如果你不这样做,那么你就没有。见eval.in/private/ed061ca92bcd48

标签: xpath simplexml php isset


【解决方案1】:

你已经很接近它了,这样做:

if (isset($_GET['blog_no'])) { 

    $id = $_GET['blog_no'];
    $xml = simplexml_load_string($x); // assume XML in $x
    $element = $xml->xpath("//element[@id='$id']")[0];
    echo "$element[size] - $element[category]<br />$element->title<br />";

} else {

    echo "No post selected!"
}

解释:

  1. 在 xpath 中,//element 表示选择 XML 中任意位置的每个 &lt;element&gt;
  2. xpath 将始终返回一个数组,[0] 将只选择第一个匹配项。这种语法适用于 PHP >=5.4,如果你低于,请告诉我,我会发布正确的代码。
  3. 不需要foreach,只能选择一个&lt;element&gt;,因为id 是唯一的(我猜)。

看到它的工作:http://codepad.viper-7.com/LY3itL

【讨论】:

  • 感谢您的回答。但是在我的服务器上它不起作用。这里有一个错误:$element = $xml-&gt;xpath("//element[@id='$id']")[0]; 调用非对象上的成员函数 xpath()。看来我的变量有些问题......我已经在我的 htaccess 文件中设置了 php 5.4
  • @freaky 你把文件的内容读入$x 变量了吗?
  • 是的,我加载了 xml 文件并放入了 $x... 也许我没有正确写入:$x = simplexml_load_file('data.xml');
  • 啊,好吧,你应该尝试用$xml = simplexml_load_file('data.xml');替换$xml = simplexml_load_string($x);
  • 没有这样的错误,但回显只是显示例如:$element[size]。好像没有成功找到xml元素节点...
【解决方案2】:

我找到了解决办法:

if(isset($_GET["blog_no"])) {

    if (file_exists('data.xml')) {

        $elements = new SimpleXMLElement('data.xml', null, true);

        foreach ($elements->element as $element) {  

            if ($element['id'] == $_GET["blog_no"]) {
                echo $element['size'];
                echo $element['category'];
                echo $element->title;

                break;
            }
        }
    }else {
        exit('Failed to open data.xml.');
    }
}

我不知道这是否是最好的方法,但效果很好。

【讨论】:

  • 看来你从我的回答中得到了一些灵​​感:)
  • 是的!感谢您的 if 文件存在!
  • 也许我需要在 if 中添加一个 return 来停止 foreach 以避免一次又一次地执行 foreach?我不知道它是如何与 php 一起工作的。
  • 当然,你可以在最后一个echo之后写break;
  • 好的。返回;在php中做不一样的事情?
【解决方案3】:

这个怎么样...

<?php
if (isset($_GET['blog_no'])) 
{
    $i = $_GET['blog_no'];

    if (file_exists('data.xml')) 
    {
        $xml = simplexml_load_file('data.xml');

        $query = '/elements/element[@id="'.$i.'"]';

        $elements = $xml->xpath($query);

        foreach ($elements as $element) 
        {
            echo $element['size'];
            echo $element['category'];
            echo $element->title;
        }
    }
    else
    {
        exit('Failed to open data.xml.');
    }
}
?>

请参阅上面的 Xpath 在这里工作:codepad.viper-7.com/QgYeqK

感谢@michi 介绍codepad.viper-7.com

【讨论】:

  • 感谢您的回答,但它不起作用。此处出现错误:$xml = new simplexml_load_file('data.xml'); 和此处 $query = $xml-&gt;xpath('/elements/element[@id={$i}]');' and here foreach($query as $element) `
  • 是的,对不起。我已经更新了上面的答案。请你再试一次。
  • 我尝试使用您更新的代码。没有任何错误,但没有显示任何内容。我认为它来自foreach。看我的回答,它有效,但它可能不是最好的方法......
  • @freaky xpath 方法对你不起作用很烦人。我又更新了一次。所以如果你愿意,你可以再试一次。现在得睡觉了。但如果还是不行,我明天再调查一下。
  • 你的$xml 已经代表&lt;elements&gt; 节点,所以不要把它放到你的xpath中。
猜你喜欢
  • 2013-06-30
  • 2018-06-01
  • 2018-04-06
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多