2008-10-29 101 views
3

使用空字符串調用addChild作爲值(或者甚至用空格)似乎會導致在節點內添加多餘的SimpleXml節點,而不是僅添加沒有節點的節點值。帶有空字符串的PHP SimpleXML :: addChild - 冗餘節點

這裏的內容做一個快速演示:

[description] => !4jh5jh1uio4jh5ij14j34io5j! 

而且這裏有一個空字符串是:

[description] => SimpleXMLElement Object ([0] =>) 

我使用的是目前的解決方法是很可怕 - 我做在最終的JSON上替換一個str_replace!4jh5jh1uio4jh5ij14j34io5j!用空字符串。呸。也許現在唯一的答案是'提交一個錯誤報告給simplexml'...

有沒有人有更好的解決方案?

回答

0

也許我不理解問題的權利,但是,在我看來,當您使用addChild方法時,無論內容是什麼,都需要使用字符串作爲節點名稱的參數節點。值(第二個參數)是可選的,可以留空以添加和清空節點。

讓我知道是否有幫助。

1

我想我想通了。像這樣由於代碼:

$xml = new SimpleXMLElement('<xml></xml>'); 
$xml->addChild('node','value'); 
print_r($xml); 

$xml = new SimpleXMLElement('<xml></xml>'); 
$xml->addChild('node',''); 
print_r($xml); 

$xml = new SimpleXMLElement('<xml></xml>'); 
$xml->addChild('node'); 
print_r($xml); 

輸出是這樣的:

SimpleXMLElement Object 
(
    [node] => value 
) 
SimpleXMLElement Object 
(
    [node] => SimpleXMLElement Object 
     (
      [0] => 
     ) 

) 
SimpleXMLElement Object 
(
    [node] => SimpleXMLElement Object 
     (
     ) 

) 

所以,爲了讓這個萬一#2的空元素不會創建(也就是說,如果你不知道如果第二個參數將是一個空字符串或沒有),你可能只是做這樣的事情:

$mystery_string = ''; 

$xml = new SimpleXMLElement('<xml></xml>'); 
if (preg_match('#\S#', $mystery_string)) // Checks for non-whitespace character 
    $xml->addChild('node', $mystery_string); 
else 
    $xml->addChild('node'); 

print_r($xml); 
echo "\nOr in JSON:\n"; 
echo json_encode($xml); 

爲了輸出:

SimpleXMLElement Object 
(
    [node] => SimpleXMLElement Object 
     (
     ) 

) 

Or in JSON: 
{"node":{}} 

這就是你想要的嗎?我個人從來沒有使用過SimpleXML,並且不僅僅是因爲這種奇怪的行爲 - 它仍然處於重大的發展階段,在PHP5中缺少像2/3需要做DOM操作的方法(比如deleteChild ,replaceChild等)。我使用DOMDocument(標準化,快速和功能完備,因爲它是一個libxml2的接口)。

0

我創建了一個Xml庫,其中擴展了simpleXml對象以包含DOMDocument中存在的所有功能,但缺少來自SimpleXml的接口(因爲這兩個函數與相同的底層libxml2對象交互 - 引用)。它還具有諸如AsArray()或AsJson()之類的細節,可以用這些格式之一輸出對象。

我剛剛更新了庫,以便在輸出JSON時按照您的預期工作。你可以做到以下幾點:

$xml = new bXml('<xml></xml>'); 
$xml->addChild('node', ''); 
$json_w_root = $xml->asJson(); // is { 'xml': {'node':'' } } 
$json = $xml->children()->asJson(); // is { 'node' : '' } as expected. 

圖書館在http://code.google.com/p/blibrary/

+1

訣竅是在jSON編碼之前將simpleXML對象轉換爲數組。 – null 2009-01-03 04:55:21

1

用SimpleXML,對谷歌代碼託管,你會得到什麼,如果你使用的print_r()或後續代碼var_dump(),序列化(),或類似,不對應於內部存儲在對象中的內容。這是一個「神奇」的對象,它重載了PHP傳遞內容的方式。

只有使用AsXML()才能得到元素的真實表示。

當像print_r()這樣的東西迭代SimpleXML元素或者使用 - >運算符訪問它的屬性時,會得到一個對象的老化版本。這種通用版本允許你像「echo $ xml-> surname」或$ xml-> names [1]那樣執行某些操作,就好像它們真的具有這些屬性一樣,但是與munged representation元素中包含的真正XML相分離不一定按順序排列,名稱爲PHP保留字(如「var」)的元素不作爲屬性顯示,但可以使用$ xml [「var」]之類的代碼訪問 - 就好像對象是關聯數組。在多個兄弟元素具有相同名稱的情況下,它們呈現爲數組。我猜一個空字符串也出於某種原因像數組一樣。但是,使用AsXML()輸出時,您會得到真實的表示。