我正在尝试比较两个SimpleXML Objects
。
一个是从DB获取的,另一个是从XML API获取的,但结果总是假的,无论XML是否实际上是相同的。
我做错了什么?
$objDbXml = simplexml_load_string($objReisen->xml); // XML from DB
$objApiXml = simplexml_load_string(getXMlFromApi()); // XML from Api
var_dump($objDbXml->Reise->Z_LEISTUNGEN == $objApiXml->Reise->Z_LEISTUNGEN);
// Result is always false
var_dump的输出($ objDbXml-> Reise-> Z_LEISTUNGEN,$ objApiXml-> Reise-> Z_LEISTUNGEN):
object(SimpleXMLElement) #69 (1) {
["TextLine"]= > array(11) {
[0] = > string(43) "Erlebnisreise mit höchstens 13 Teilnehmern"
[1] = > string(39) "Durchführungsgarantie ab 4 Teilnehmern"
[2] = > string(127) "Linienflug mit South African Airways von Frankfurt a.M. nach Kapstadt und zurück von Port Elizabeth (von München auf Anfrage)"
[3] = > string(28) "Reiseminibus mit Klimaanlage"
[4] = > string(111) "Übernachtungen in Hotels und Lodges sowie 2 Übernachtungen in einer exklusiven Lodge im Kariega Game Reserve"
[5] = > string(67) "Täglich Frühstück, 2 x Mittagessen, 4 x Abendessen, 1 Weinprobe"
[6] = > string(123) "1 Safari im Addo-Elephant-NP; 2 Safaris im offenen Geländewagen, 1 Wandersafari und 1 Bootsfahrt im Kariega Game Reserve"
[7] = > string(41) "Nationalparkgebühren und Eintrittsgelder"
[8] = > string(14) "Reiseliteratur"
[9] = > string(43) "Zertifikat über 100 m² Regenwald für Sie"
[10] = > string(42) "Deutsch sprechende Chamäleon-Reiseleitung"
}
}
object(SimpleXMLElement) #67 (1) {
["TextLine"]= > array(11)
{
[0] = > string(43) "Erlebnisreise mit höchstens 12 Teilnehmern"
[1] = > string(39) "Durchführungsgarantie ab 4 Teilnehmern"
[2] = > string(127) "Linienflug mit South African Airways von Frankfurt a.M. nach Kapstadt und zurück von Port Elizabeth (von München auf Anfrage)"
[3] = > string(28) "Reiseminibus mit Klimaanlage"
[4] = > string(111) "Übernachtungen in Hotels und Lodges sowie 2 Übernachtungen in einer exklusiven Lodge im Kariega Game Reserve"
[5] = > string(67) "Täglich Frühstück, 2 x Mittagessen, 4 x Abendessen, 1 Weinprobe"
[6] = > string(123) "1 Safari im Addo-Elephant-NP; 2 Safaris im offenen Geländewagen, 1 Wandersafari und 1 Bootsfahrt im Kariega Game Reserve"
[7] = > string(41) "Nationalparkgebühren und Eintrittsgelder"
[8] = > string(14) "Reiseliteratur"
[9] = > string(43) "Zertifikat über 100 m² Regenwald für Sie"
[10] = > string(42) "Deutsch sprechende Chamäleon-Reiseleitung"
}
}
答案 0 :(得分:11)
这里的问题,就像SimpleXML一样,是因为SimpleXMLElement不是“普通”的PHP对象。 SimpleXML不是一个解析器,它使用属性和方法来扩展完全形成的PHP对象,而是一个链接到XML文档内部表示的“实时”API。
Comparing Objects上的手册页指出“如果两个对象实例具有相同的属性和值,则它们是相同的,并且是同一类的实例。”当您在SimpleXMLElement上运行print_r()
或var_dump()
时,它将出现 以具有表示子节点和属性的属性,这对于使用相同XML构建的两个对象是相同的。但是,实际实现只包含指向解析XML时创建的内存结构的指针,即使您解析相同的字符串两次也会有所不同。因此,简单地将两个SimpleXMLElement对象与==
进行比较将永远不会返回true
。
实际的解决方案取决于您想要比较的内容:
->asXML()
获取文档该部分的XML字符串;例如$objDbXml->Reise->Z_LEISTUNGEN->asXML() == $objApiXml->Reise->Z_LEISTUNGEN->asXML()
答案 1 :(得分:1)
opensource TurboCommons库包含一个名为XMLUtils的类,它包含一个名为isEqualTo()的强大的xml比较方法。
有了它,你可以检查两个xml字符串或simplexml元素是否相等,即使它们的元素和属性有不同的顺序。
https://github.com/edertone/TurboCommons
要使用它,请下载phar文件并将其导入您的项目。
一个简单的例子:
use org\turbocommons\src\main\php\utils\XmlUtils;
XmlUtils::isEqualTo('<root><a/></root>', '<root><a></a></root>');
// Returns true
XmlUtils::isEqualTo('<root><a/></root>', '<raat><a/></raat>');
// Returns false