AddChild ve addAttribute metin değerleri SimpleXMLElement kullanacağıyla arkasında Gerekçe

6 Cevap php

Bu tutarsız bir davranış değil midir? (PHP 5.2.6)

<?php

$a = new SimpleXMLElement('<a/>');

$a->addAttribute('b', 'One & Two');
//$a->addChild('c', 'Three & Four'); -- results in "unterminated entity reference" warning!
$a->addChild('c', 'Three &amp; Four');
$a->d = 'Five & Six';

print($a->asXML());

Işler:

<?xml version="1.0"?>
<a b="One &amp; Two">
    <c>Three &amp; Four</c>
    <d>Five &amp; Six</d>
</a>

Bugs.php.net azından bir özellik söyleyerek, bu konuda tüm gönderimler reddetmek. Neden olabilir ki? BTW, SimpleXMLElement tarafından metin değerlerini kaçan bu uyuşmazlık hakkında dokümanlar şey yok.

Herkes mümkün iyi API tasarım karar beni ikna edebilir?

6 Cevap

Sadece emin biz aynı sayfada konum yapmak için, üç durumlar var.

  1. AddAttribute kullanarak bir öznitelik içine bir ampersand ekleme

  2. AddChild kullanarak bir öğe içine bir ampersand ekleme

  3. Özellik aşırı yüklenmelerden bir öğenin içine bir ampersand ekleme

Bu afallamış olan 2 ve 3 arasında tutarsızlık bulunuyor. Neden addChild otomatik nesnesine bir özellik ekleme ve does otomatik işareti kaçmak değerini ayarlayarak, oysa işareti kaçış yok?

Benim içgüdüleri dayalı, ve this bug tarafından desteklenmektedir, bu kasıtlı bir tasarım karardı. Aşırı yükleme özelliği ($ a-> d = 'Beş ve Altı' ;) şeyler yapmanın "Benim için ve işaretleri kaçış" yolu olması amaçlanmıştır. AddChild yöntemi yöntemi "Ben eklemek için söylemek tam olarak ne eklemek" olması gerekiyordu. Yani, ihtiyacınız hangisi davranış, SimpleXML sizi ağırlayacak.

Diyelim ki tüm imi zaten kaçtı metin bir veritabanı vardı diyelim. Otomatik öncelemeli burada sizin için işe yaramaz. Eğer addChild kullanmak istiyorum orası. Veya belgenizin bir varlık eklemek için gerekli Diyelim

$a = simplexml_load_string('<root></root>');
$a->b = 'This is a non-breaking space &nbsp;';
$a->addChild('c','This is a non-breaking space &nbsp;');	
print $a->asXML();

O bug PHP Geliştirici savunan budur. AddChild davranışı bunu kaçtı olmadan belgeye bir işareti eklemek için gerektiğinde bir "daha az basit, daha güçlü" destek sağlamak içindir.

Tabii ki, bu bahsettiğim ilk durum, addAttribute yöntemi ile bize kalkıyor. AddAttribute yöntemi does ve işaretleri kaçış. Peki, şimdi olduğu gibi tutarsızlık devlet olabilir

  1. AddAttriute yöntem ve işaretleri kaçar
  2. AddElement yöntemi does not ve işaretleri kaçış
  3. Bu davranış biraz tutarsız. Bir kullanıcı methods SimpleXML tutarlı bir şekilde bir şeyler kaçmak için beklediğiniz makul

Bu daha sonra SimpleXML API ile gerçek bir sorun ortaya koyar. Burada ideal durum olacaktır

  1. Eleman nesneleri üzerinde aşırı yüklenmesi Mülkiyet ve işaretleri kaçar
  2. Özellik nesneleri üzerinde aşırı yüklenmesi Mülkiyet ve işaretleri kaçar
  3. AddElement yöntem ve işaretleri kaçış yok
  4. addAttribute yöntem ve işaretleri kaçış yok

SimpleXML bir Özellik nesne kavramı yok, çünkü bu, olsa da imkansız değildir. AddAttribute yöntemi (görünüyor?) Bir öznitelik eklemek için tek yoldur. Bu nedenle, bu (görünüyor?) Çıkıyor SimpleXML kuruluşlar ile özelliklerini yaratma aciz içinde.

Tüm bu Simple XML paradoksu ortaya koymaktadır. Bu API arkasındaki fikir karmaşık olduğu ortaya çıkıyor şey ile etkileşim, basit bir şekilde sağlamak için oldu.

Takım SimpleXMLAttribute nesnesi eklenmiş olabilir, ama bu karmaşıklığı bir eklenen katman bulunuyor. Birden çok nesne hiyerarşisini istiyorsanız, DomDoument kullanın.

Ekip AddAttribute ve addElement bayraklar eklenmiş olabilir, ancak bayraklar API daha karmaşık hale getirmektedir.

Burada gerçek ders? Belki basit sabit ve bir süre üzerinde basit olduğunu bile zordur mi. Bu böyleydi olmadığını bilmiyorum, ama birisi basit bir fikir (kullanım özelliği kolay XML belgelerinin oluşturulması yapmak için aşırı yükleme) ile başladı ve sorunlar / özellik istekleri geldi gibi daha sonra düzeltilmiş gibi SimpleXML ile görünüyor .

Aslında, ben ;) burada gerçek ders sadece JSON kullanmak için olduğunu düşünüyorum

"Diyelim ki tüm imi zaten kaçtı metin bir veritabanı vardı diyelim."

Bunu yapıyorsanız, yanlış yapıyoruz. Veri şu anda kullandığınız çıktı türü ne olursa olsun için munged değil, en doğru biçimde saklanmalıdır. Aslında veritabanında (geçerli) HTML lekeler saklamak, bu da kötüdür. AddChild () kullanarak ve tekrar dışarı verileri kapma HTML yok edecek; hiçbir mantıklı kütüphane sergiler böyle korkunç asimetri.

addChild () sizin için metni kodlama değil tamamen karşı sezgisel. Bu korumak değil bir API noktası nedir? Bu sizin değerlerden birinde bir çift tırnak kullanırsanız barfing () json_encode gibi.

Neyse, orijinal soruyu cevaplamak için: Açıkçası, ben de iyi bir karar olmadığını düşünüyorum. Ben oldukça doğru olmaktan çok, "hızlı" ne birinin fikrini yerine getirmek için PHP'nin tasarım kararlarının, bir sürü ile tutarlı olduğunu düşünüyorum yok.

Bu, özellikle bu aynı etiket-isimde çok sayıda oğul ekleyerek çözer, benim çözüm

$job->addChild('industrycode')->{0} = $entry1;
$job->addChild('industrycode')->{0} = $entry2;
$job->addChild('industrycode')->{0} = $entry3;

The requirement for escaping the characters & ve < bölümünde sağlanan Character Data and Markup değil bölüm Özellik-Değer Normalleştirme in, önceki cevabı devletler olarak.

To quote the XML Spec .:

"Imi (&) ve açılı sol ayraç (<) biçimlendirme ayracı olarak kullanılmaları dışında, ya da bir yorum, bir işleme talimatı veya bir CDATA bölümü içinde, kendi edebi formda ortaya çıkmamalıdır. Onlar gerekli ise Başka bir yerde ", ya sayısal karakter gönderimleri ya da dizeleri &amp; kullanılarak kaçtı ZORUNLU ve &lt;, sırasıyla

Alan Fırtına ancak o açıklar paradoks kolay bir çözüm var, konuya güzel bir açıklama vardı. AddChild () yöntemi otomatik öncelenişi belirler isteğe bağlı Boole parametresi olabilir. Yani, ben hala bu sadece bir (çok) kötü tasarım seçim olduğunu eminim.

Karışıklık gerçeği ile birleşir addChild için belgeler () yöntemi, hiçbir başvuru böylece sorunu (olmasına rağmen tartışmada olduğu) yapar. Ayrıca yöntem, some karakteri (yani işaretleri daha az ve daha büyük) kaçar. Bu genel karakterleri kaçar inanmak yöntemi kullanarak geliştiriciler yanıltmak olacaktır.

Ben bu XML spec gerektirir Attribute-Value Normalization neden olduğuna inanıyorum.