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] => SimpleXMLElement Object ( ) )
(libxml 2.9.1),但执行 echo (string)$ln[0]
确实 会给出文本内容。所以,它匹配,它找到它,它只是在print_r
/var_dump
中以不同的方式表示这一点。如果您在 5.4 代码中遇到错误,很可能是在其他位置。
【参考方案1】:
当涉及到SimpleXml
时,不要依赖print_r
或var_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 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Bcrypt 在 Lumen 5.4 中不起作用:调用未定义的函数 bcrypt()
Vue 2.x + Laravel 5.4 在资源管理器中不起作用