PHP SimpleXML boş dize ile :: addChild - gereksiz düğüm

4 Cevap php

Değeri (hatta boşluklar) gibi boş bir dize ile addChild Calling gereksiz SimpleXML düğüm yerine hiçbir değeri ile sadece düğüm ekleme düğüm içinde eklenecek neden gibi görünüyor.

İşte ne hızlı bir demo:

[description] => !4jh5jh1uio4jh5ij14j34io5j!

Ve burada boş bir dize var:

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

Ben şu anda kullanıyorum çözüm oldukça korkunç - ben 4jh5jh1uio4jh5ij14j34io5j yerine nihai json bir str_replace yapıyorum! boş bir dize ile. Yuck. Belki de bu noktada tek cevap 'SimpleXML bir hata raporu gönderin' olduğunu ...

Herkes daha iyi bir çözüm var mı?

4 Cevap

Ben neler olduğunu anladım düşünüyorum. Bu gibi bir kod Verilen:

$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);

Çıktısı şudur:

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

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

)

Yani, bunu yapmak için, böylece durumda # 2 boş elemanı (ikinci argüman boş bir dize ya da olacak eğer bilmiyorsanız yani), sadece böyle bir şey yapabileceğini oluşturulmadı:

$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);

Çıkışı için:

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

)

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

İstediğin bu mu?

Şahsen, ben SimpleXML kullanın, çünkü garip davranış bu tür değil, sadece asla - bu önemli gelişme aşamasında olduğunu ve PHP5 (deleteChild gibi, replaceChild vb) DOM manipülasyon yapmak için gereken yöntemleri 2/3 gibi eksik .

Ben (bu libxml2'nin bir arayüz olduğundan, standart, hızlı ve özellik tam olduğu) DOMDocument kullanın.

SimpleXML ile, () print_r (), veya var_dump kullanmak durumunda ne olsun, serialize (), veya benzer, nesne dahili saklanan ne karşılık gelmez. PHP içeriğini interates yol overloads 'sihirli' bir nesnedir.

Sen asXML ile elemanın gerçek temsilini olsun () sadece.

Bir SimpleXMLElement öğe üzerinde print_r () dolaşır gibi bir şey ya da kullanarak kendi özelliklerine eriştiğinizde -> operatörü, nesnenin bir munged versiyonu olsun. Bu munged sürüm "echo $ xml-> soyadı" ya $ xml-> isimleri gibi şeyler [1] gerçekten özellikleri olarak bu vardı, ama içinde bulunan gerçek XML ayrı sanki yapmanızı sağlar: munged temsil elemanları sırayla olması gerekmez, ve adları ("var" gibi) PHP ayrılmış kelimelerdir elemanları özellikleri olarak sunulan değil, $ xml ["var"] gibi bir kod ile ulaşılabilir - Nesne birleşmeli dizi sanki . Birden kardeş elemanları aynı ada sahip Nerede diziler gibi sunulmaktadır. Ben boş bir dize de nedense bir dizi gibi sunulmaktadır sanırım. Ancak, asXML kullanarak çıkış () Eğer gerçek bir temsile olsun.

Belki doğru ama soruyu anlamak değilim, bu addChild yöntemini kullandığınızda, ne olursa olsun içerik düğümü ne düğümün adı için bir argüman olarak bir dize olması gereken konum gibi geliyor bana. Değeri (ikinci argüman) isteğe bağlıdır ve eklemek için boş ve boş düğüm bırakılabilir.

Eğer yardımcı olur bana bildirin.

Ben DOMDocument mevcut ama SimpleXML (- referansla iki işlevi aynı temel libxml2 nesne ile etkileşim gibi) bir arabirim eksik işlevsel tüm dahil SimpleXML nesnesini genişleten bir Xml kütüphane oluşturduk. Ayrıca, bu biçimlerden birinde çıkış nesne böyle AsArray () veya AsJson () gibi incelikler vardır.

Ben sadece JSON çıktısı zaman beklediğiniz gibi çalışmak için kütüphane güncelledik. Sen aşağıdakileri yapabilirsiniz:

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

Kütüphane http://code.google.com/p/blibrary/ de google kod barındırılan