2016-03-23 15 views
4

Ben XML dosyasını ayrıştırır bir PHP komut dosyası yapılmış ve bunu ayrıştırmak çalıştığınızda bir hata çıkıyor:Ad alanı öneki tanımlanmadı. Nasıl otomatik olarak tanımlayabilirim/hatayı görmezden gelebilirim?

2: DOMDocument :: load(): bilgi üzerine temsil için ad alanı öneki EDF tanımlanmamıştır /users/zzz/testing/meta.xml, hat girişi: 2

Ben bir düzeltme için arama oldum ama herhangi bulamadık, bu yüzden buraya post ediyorum. Gördüğünüz gibi DOMDocument sınıfını kullanıyorum.

$dom = new DOMDocument(); 
$metaXML = $dom->load($path."/meta.xml"); 

yolu ve tamamı doğru, eminim:

XML ayrıştırma için My kod benziyor. Öneki kaldırdığımda, iyi çalışıyor.

<meta> 
    <info gamemodes="race" type="map" edf:represent="false"></info> 
</meta> 

EDF: hataya neden oluyor = "false" temsil XML gibi görünüyor. edf ad alanı önekini el ile silmek istemiyorum, çünkü bu ayrıştırmak istediğim tek XML dosyası değil. Yüzlerce tanesi var ve sayı artıyor.

Yani, sorum şu, bu hatayı nasıl yok sayabilirim (yalnızca XML ad alanı nesnesi için) veya DOMDocument sınıfı aracılığıyla ad alanı önekini nasıl tanımlayabilirim/kaldırabilirim?

cevap

3

Bu bir uyarı değil, bir hatadır. Böylece XML hala kullanılabilir, ancak bozulur. En iyi çözüm, XML'i - ad alanının tanımlanması - onarmaktır.

İsimlerin tanımlanması otomatik olarak çalışmaz.Ad alanı öneki yalnızca bir takma addır, gerçek ad alanı xmlns özniteliğinin değeridir. Diğer ad yalnızca öğe ve onun soyundan gelenler için geçerlidir. XML'i oluşturan komut dosyası/uygulama, ad alanı tanımını ekleyeceği şekilde onarılmalıdır.

Çözümleyici ad alanını çözecektir. "Edf:" seçeneğini "{urn: example} temsilci" olarak okuyabilirsiniz. Ancak, libxml_use_internal_errors() kullanarak ayrıştırma hatalarını ve uyarılarını engelleyebilirsiniz.

$xml = <<<'XML' 
<meta> 
    <info gamemodes="race" type="map" edf:represent="false"></info> 
</meta> 
XML; 

libxml_use_internal_errors(TRUE); 

$dom = new DOMDocument(); 
$dom->loadXml($xml); 

echo $dom->saveXml(); 

Çıktı:

<?xml version="1.0"?> 
<meta> 
    <info gamemodes="race" type="map" represent="false"/> 
</meta> 

libxml_get_errors() ile kendi hata işleme uygulayabilir.

Çıktıda gördüğünüz gibi, XML ayrıştırıcı ad alanı önekini kaldırdı. Bu, "temsil" in artık isimsiz bir özellik olduğu, kimliğini değiştirdiği anlamına gelir. Gerçekten dikkatli olun, represent ve {urn:example}represent iki farklı addır, ilgili bağlam bilgilerini kaybedersiniz.

+0

Teşekkür ederim, ** libxml_use_internal_errors ** fonksiyonunu bilmiyordum. Şimdi çalışıyor. – GTX

2

XML dosyasının kendisi iyi oluşturulamıyor, çünkü bildirilmemiş bir ad alanı öneki kullanılıyor. Ya ör bildirilmemiş ad alanı öneki kaldırabilir veya beyan:

<meta xmlns:edf="http://www.example.com/"> 
    <info gamemodes="race" type="map" edf:represent="false"></info> 
</meta> 

Güncelleme: iyi biçimlendirilmiş olmadığından Sen bir XML kütüphanesi kullanarak bu işlemi gerçekleştirmek mümkün değil. El ile yapmalı veya dosya üzerinde XML olarak değil, metin olarak programlı olarak çalışmalısınız. Metninizi iyi oluşturulmuş bir XML haline getirdikten sonra, işlenecek standart XML kitaplıklarını kullanabileceksiniz. İşte

@Daniel tarafından programlı bir metin tabanlı düzenleme öneri:


Eğer birçok dosya arasında biçimlendirme bu eksikliği gidermek ile meta etiketi yerine 'sed' gibi bir araç kullanmayı düşünün gerekiyorsa düzeltilmiş versiyon. Örneğin, <meta'un tüm örneklerini bir klasör içinde <meta xmlns:edf="http://www.example.com/" ile değiştirmek için. Sen

sed -i -- 's/<meta/<meta\ xmlns\:edf\=\"http\:\/\/www.example.com\/\"/g' * 

sed nasıl kullanılacağı hakkında daha fazla bilgilenmek için https://unix.stackexchange.com/questions/112023/how-can-i-replace-a-string-in-a-files bakın bu komutu kullanabilirsiniz.


Eh biçimlendirilmiş XML hep yukarıda bizi oraya yardımcı olabilir gibi bazen kirli hızlı ve-fix bir XML ayrıştırıcı kullanılarak ayrıştırılır, ancak edilmelidir.

+0

PHP ile otomatik olarak nasıl tanımlayabilirim veya kaldırabilirim? Dediğim gibi, bunun gibi çok fazla XML dosyam var ve tek tek değiştirmek istemiyorum. – GTX

+0

** Testere güncellemesi ** Hmm, tamam, anlıyorum. Fakat XML'in “iyi biçimlendirilmemiş” olup olmadığını kontrol etmenin herhangi bir yolu var mı? Çünkü şu an bir hata döndürüyor ve sadece programdan çıkıyor. 'ifadesiyle (! MetaXML) {...}' ifadesiyle denedim ancak yine de bir hata döndürdü. – GTX

+0

XML'in iyi oluşturulup oluşturulmadığını kontrol etmenin yolu basitçe onu ayrıştırmaktır. İyi biçimlendirilmemişse, tanıma göre hatalar alırsınız. – kjhughes