PHP SimpleXML kullanırken yerel DTD başvurmak için, ben bir dosya türü tanım içine mutlak yolunu dönüştürmek gerekir. Örneğin, :/ / / home / siteadı / www / xml / example.dtd dosyasına ev / siteadı / www / xml / example.dtd / dönüştürmek.
Gerekli olduğu tüm yol önünde 'Dosya' düzeni eklemek olduğu verilen örnekte, bu kolaydır. Bir durum gibi dizin isimlerinden biri boş orada olarak doğar Ama eğer, bu yeterince iyi değil. Mekanizma, Windows veya Linux üzerinde çalışmak ve dizin adları ASCII olmayan karakterler için izin vermelidir.
Şimdiye kadar icat kodu:
$absparts = explode('/', _ALIRO_ABSOLUTE_PATH);
$driveletter = (0 == strncasecmp(PHP_OS, 'win', 3)) ? array_shift($absparts) : '';
$filename = $driveletter.implode('/', array_map('rawurlencode', $absparts)).'/xml/'.$filename.'.dtd';
$href = 'file:///'.$filename;
tanımlı bir sembol sistem kökü (daima ileriye ile bölü) için mutlak yoludur, DTD xml altdizininde ve uzantısı. dtd izledi $ dosya bir adı vardır.
Bu düzgün çalışacak mı? Daha iyi bir yaklaşım var mı?
Ben biraz daha arka plan anlatalım. Amaç SimpleXML kullanarak bir XML belgesini ayrıştırmak için. Bu LIBXML_DTDVALID seçeneği ile simplexml_load_string () fonksiyonu kullanılarak yapılır. XML belgesi, bir ev bir web sitesine gerçek bir URI işaret içerecek, ama uzak bir web sitesine ulaşan yer gecikmeler tanıtmak istiyorum, ya da istekleri ile ev web sitesi kadar yük yok. Yerel makineye başvurmak şekilde DTD'ye referans nedenle düzenlenir. Ama bu XML belgesi içinde bir DOCTYPE'ta içinde bir tanım olarak gömülü olmalıdır. Kısıtlamaları bir DOCTYPE'ta için kurallar örtük ve SimpleXML işlevi yürütür, benim seçimim değil. Ben dosya mutlak bir yol olarak nerede çalışmak, ama bir DOCTYPE'ta içine koymak için, bir tanım haline dönüştürülmesi gerekir.