gpt4 book ai didi

php - 比较 SimpleXml 对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:59:17 25 4
gpt4 key购买 nike

我正在尝试比较两个 SimpleXML 对象

一个是从数据库中获取的,另一个是从 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"
}
}

最佳答案

与 SimpleXML 一样,这里的问题在于 SimpleXMLElement 不是“普通”PHP 对象。 SimpleXML 不是一个解析器,它吐出具有属性和方法的完整形式的 PHP 对象,而是一个链接到 XML 文档的内部表示的“实时”API。

Comparing Objects 上的手册页声明“如果两个对象实例具有相同的属性和值,并且是同一类的实例,则它们是相等的”。当您在 SimpleXMLElement 上运行 print_r()var_dump() 时,它似乎具有代表子节点和属性的属性,这将是对于从相同的 XML 构建的两个对象相同。但是,实际 实现仅包含一个指向在解析 XML 时创建的内存结构的指针,即使您两次解析相同的字符串,它也会有所不同。因此,简单地将两个 SimpleXMLElement 对象与 == 进行比较将永远不会返回 true

实际的解决方案取决于您要比较的内容:

  • 如果您想查看 XML 的特定片段是否在两个文档之间 100% 相同,您可以使用 ->asXML() 来获取文档该部分的 XML 字符串;例如$objDbXml->Reise->Z_LEISTUNGEN->asXML() == $objApiXml->Reise->Z_LEISTUNGEN->asXML()
  • 如果您想要比较一些特定的属性,您最好选择那些并单独比较它们,这样即使它们出现的顺序略有不同,或者使用特殊字符编码,测试也会返回 true略有不同

关于php - 比较 SimpleXml 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17935118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com