【发布时间】: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 代码中遇到错误,很可能是在其他位置。