simpleXML 在 php 5.4 中不起作用

Posted

技术标签:

【中文标题】simpleXML 在 php 5.4 中不起作用【英文标题】:simpleXML in not working php 5.4 【发布时间】:2014-04-17 06:13:18 【问题描述】:

在我的开发系统 php 5.3 上,以下 SimpleXML 对象工作正常:

    $fs = "lectio1"
    $xmldoc = simplexml_load_file($filename);
    $ln = $xmldoc->xpath("//item[fileName/@filestem='$fs']/title");
    print_r($ln)


Array ( [0] => SimpleXMLElement Object ( [0] => Lectio 1, Prologus ) )

但是 php 5.4 中的相同函数会产生以下结果。

Array ( [0] => SimpleXMLElement Object ( ) )

谁能帮我弄清楚发生了什么?

XML文件片段如下:

 <?xml version="1.0" encoding="UTF-8"?>
 <listofFileNames>
 <div id="body">
    <div id="principia" class="toplevel">
        <head>Principia</head>
        <item>
            <fileName filestem="principiumI">principiumI.xml</fileName>
            <title>Principium I</title>
            <hasParts>
                <part>
                    <slug>vat</slug>
                    <title>Vatican</title>
                    <initial>V</initial>
                </part>
            </hasParts>
        </item>
        <item>
            <fileName filestem="principiumII">principiumII.xml</fileName>
            <title>Principium II</title>
            <hasParts>
                <part>
                    <slug>vat</slug>
                    <title>Vatican</title>
                    <initial>V</initial>
                </part>
            </hasParts>
        </item>
        <item>
            <fileName filestem="principiumIII">principiumIII.xml</fileName>
            <title>Principium III</title>
            <hasParts>
                <part>
                    <slug>vat</slug>
                    <title>Vatican</title>
                    <initial>V</initial>
                </part>
                <part>
                    <slug>sorb</slug>
                    <title>Sorbonne</title>
                    <initial>S</initial>
                </part>
            </hasParts>
        </item>
        <item>
            <fileName filestem="principiumIV">principiumIV.xml</fileName>
            <title>Principium IV</title>
            <hasParts>
                <part>
                    <slug>reims</slug>
                    <title>Reims</title>
                    <initial>R</initial>
                </part>
                <part>
                    <slug>svict</slug>
                    <title>St. Victor</title>
                    <initial>SV</initial>
                </part>
                <part>
                    <slug>sorb</slug>
                    <title>Sorbonne</title>
                    <initial>S</initial>
                </part>
            </hasParts>
        </item>
    </div>
    <div id="deFide" class="toplevel">
        <head>de Fide</head>
        <item>
            <fileName filestem="lectio1">lectio1.xml</fileName>
            <title>Lectio 1, Prologus</title>
            <hasParts>
                <part>
                    <slug>reims</slug>
                    <title>Reims</title>
                    <initial>R</initial>
                </part>
                <part>
                    <slug>vat</slug>
                    <title>Vatican</title>
                    <initial>V</initial>
                </part>
                <part>
                    <slug>svict</slug>
                    <title>St. Victor</title>
                    <initial>SV</initial>
                </part>
                <part>
                    <slug>sorb</slug>
                    <title>Sorbonne</title>
                    <initial>S</initial>
                </part>
            </hasParts>
        </item>
        <item>
            <fileName filestem="lectio2">lectio2.xml</fileName>
            <title>Lectio 2, Prologus</title>
            <hasParts>
                <part>
                    <slug>reims</slug>
                    <title>Reims</title>
                    <initial>R</initial>
                </part>
                <part>
                    <slug>vat</slug>
                    <title>Vatican</title>
                    <initial>V</initial>
                </part>
                <part>
                    <slug>svict</slug>
                    <title>St. Victor</title>
                    <initial>SV</initial>
                </part>
                <part>
                    <slug>sorb</slug>
                    <title>Sorbonne</title>
                    <initial>S</initial>
                </part>
            </hasParts>
        </item>
        <item>
            <fileName filestem="lectio3">lectio3.xml</fileName>
            <title>Lectio 3, Prologus</title>
            <hasParts>
                <part>
                    <slug>reims</slug>
                    <title>Reims</title>
                    <initial>R</initial>
                </part>
                <part>
                    <slug>vat</slug>
                    <title>Vatican</title>
                    <initial>V</initial>
                </part>
                <part>
                    <slug>svict</slug>
                    <title>St. Victor</title>
                    <initial>SV</initial>
                </part>
                <part>
                    <slug>sorb</slug>
                    <title>Sorbonne</title>
                    <initial>S</initial>
                </part>
            </hasParts>
        </item>
     </div>
   </div>
 </listofFileNames>

【问题讨论】:

没有 XML 和你的 simpleXMLClean 函数很难分辨。 @Wrikken 请查看我的编辑 - 添加了 xml 您是否检查过$filename 具有预期值?你有没有转储$xmldoc 看它是否有内容?您是否检查过$fs 是否具有预期值?我有一个偷偷摸摸的怀疑这与迁移到 php5.4 无关,而与其他事情有关,例如错误的变量或不同的设置来自不同的环境 我的意思是,我可以从编辑历史记录和 Wrikken 的评论中看出,您已决定删除内容并以其他方式改变您真正在做什么。可能是为了简化问题,但您过度简化了它。从 5.3 到 5.4,这段代码本身没有理由不工作,所以你的问题是别的 @Jeff:据我所知,这只是print_r 中表示的差异(不应依赖):没有匹配是Array( ),匹配确实是Array ( [0] =&gt; SimpleXMLElement Object ( ) ) (libxml 2.9.1),但执行 echo (string)$ln[0] 确实 会给出文本内容。所以,它匹配,它找到它,它只是在print_r/var_dump 中以不同的方式表示这一点。如果您在 5.4 代码中遇到错误,很可能是在其他位置。 【参考方案1】:

当涉及到SimpleXml 时,不要依赖print_rvar_dump,而是这样做:

foreach ($ln as $l)
    echo htmlentities($l->asXML());

使用此方法,5.3.10 与 5.4.9 的结果相同

<title>Lectio 1, Prologus</title>

PHP 5.3.10:见http://codepad.viper-7.com/RL8L0i

PHP 5.4.9:见http://codepad.viper-7.com/0JgAmQ

【讨论】:

非常感谢您的帮助。确实这不是问题。关于simpleXMLbehaviour,一定有一些我真的不明白的地方。我仍然不明白为什么 print_r 在不同的系统上给我不同的结果。但我想我会切换我的函数以使用 htmlentities 而不是使用 json_decode(json_encode($ln, true) 从其 simpleXML 对象状态中删除信息。把它变成一个简单的数组,然后提取信息。您的建议似乎更清晰。

以上是关于simpleXML 在 php 5.4 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

ajax 类型的帖子在 laravel 5.4 中不起作用

Bcrypt 在 Lumen 5.4 中不起作用:调用未定义的函数 bcrypt()

Vue 2.x + Laravel 5.4 在资源管理器中不起作用

PhP 5.4 中的 PhP 上传进度不起作用。未设置会话变量

标头位置在 PHP 中不起作用 [重复]

为啥页面重定向在 php 中不起作用