2017-10-13 96 views
0

我正在一個非常廣泛的肥皂客戶端,並希望使用對象爲我的所有數據。我需要製作這樣的事情:肥皂變量在php與對象和重複標籤

<Animals> 
    <Cat> 
     <Name>Bob</Name> 
    </Cat> 
    <Cat> 
     <Name>Peter</Name> 
    </Cat> 
    <Dog> 
     <Name>Rex</Name> 
    </Dog> 
</Animals> 

所以我的動物對象會是這個樣子與狗相同的代碼,以及:(每個「貓」將是一個簡單的屬性名稱的對象)

<?php 

use ArrayObject; 

class Animals { 

public function __construct(){ 
    $this->Cat = new ArrayObject(); 
} 

/** 
* Cat 
* @var \ArrayObject 
*/ 
protected $Cat; 

/** 
* Adds a Cat 
* @param \SoapVar $cat 
*/ 
public function addCat(\SoapVar $cat) { 
    $this->Cat->append($cat); 
    return $this; 
} 

問題是,這不會產生我想要的結果。結果看起來像這樣。

<Animals> 
    <Cat> 
     <Cat> 
      <Name>Bob</Name> 
     </Cat> 
     <Cat> 
      <Name>Peter</Name> 
     </Cat> 
    </Cat> 
    <Dog> 
     <Dog> 
      <Name>Rex</Name> 
     </Dog> 
    </Dog> 
</Animals> 

SoapVar和SOAP_ENC_OBJECT似乎爲對象中的每個屬性都創建一個標記。這創建了我不想要的額外標籤。有什麼方法可以在主對象內部創建重複標籤嗎?將動物改爲ArrayObject對於我的面向對象體系結構是不可接受的。

編輯: 我找到了一個新的可能的解決方案。如果我添加一個迭代器到我的類,正確地通過我的屬性並使用SOAP_ENC_ARRAY編碼對象。它創建我想要的適當的xml結構。現在的問題是說,每個標籤被稱爲<xsd:anyType>

+0

我看來,像它做你要求它做什麼。無論是將單個'$貓'直接附加到'動物'上,還是讓外部物品成爲'貓'而不是'貓',這樣才更有意義。 –

+0

@PatrickQ如何將單個'$ cat's直接附加到'Animal'對象?這將完全解決我的問題 – Simon

+0

你能提供一些更多的代碼來使這種可重複性?此外,您正在爲'$ this-> Cat'屬性追加'$ cat'對象。只是一個猜測,但你有沒有嘗試將它附加到'$ this'? IE瀏覽器。 '$ this-> append($ cat);' – waterloomatt

回答

0

我找到了解決我的問題:

我知道如何使用ArrayObjects來解決問題,但並不想放棄用我自己的類。現在,我在我的類中包含一個將對象作爲ArrayObject返回以供進一步使用的方法。

function encode(){ 
    $arrayObject = new ArrayObject(); 
    foreach($this->Cat as $cat){ 
     $arrayObject->append($cat); 
    } 
    foreach($this->Dog as $dog){ 
     $arrayObject->append($dog); 
    } 
    return $arrayObject; 
} 

然後我可以將此ArrayObject轉換爲我需要的XML結構。

(信用此亦馬塞爾和他的博客在http://www.mm-newmedia.de/2017/10/php-und-bipro-sich-wiederholende-elemente-im-soap-request/