PHP5 ile çözümlenen XML çıktı Eksik karakterler

4 Cevap php

Ben aşağıdaki XML dosyasını ayrıştırmak çalışıyorum:

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE content PUBLIC "-//BLACKWELL PUBLISHING GROUP//DTD 4.0//EN" "http://www.blackwellpublishing.com/xml/dtds/4-0/bpg4-0.dtd">
<content dtdver="4.0" docfmt="xml">
....
<forenames>NIELS B&Oslash;IE</forenames><x> </x>

İlk başta yük olmaz, ama şimdi en az &Oslash; (Ø) gibi varlık anlamaya DTD kullanmak gibi görünüyor kodu var, ama bir sonraki sorun görünmüyor olduğunu çıktı karakter.

Bu benim ayrıştırma kodu:

$options = LIBXML_DTDLOAD | LIBXML_NOENT | LIBXML_DTDVALID | LIBXML_NOCDATA;
$doc = simplexml_load_string ( $xml,null,$options );
echo $doc->document->header->namegroup->name->forenames."\n";

Bu çıkış:

NIELS BIE

Ben DOM XML de ayrıştırma ile çalıştı ve daha sonra çıktı (bir boşluk yani ..) NIELS B IE oldu

herhangi bir fikir?

4 Cevap

DTD baktığımızda, bu (ama satır sonları olmadan) diyor ki:

<!ENTITY Oslash 
    "<symbol name='Oslash' unicode='00D8'
     type='html' glyph='@Oslash;' description='capital O, slash' 
     ascii='O' > </symbol>"
>

&Oslash;, bu metin ile değiştirin: Bu DTD kullanarak herhangi bir XML okuyucusu için, bu kaynağın harflerin tam bu arada görmek ne zaman "anlamına gelir <symbol name='Oslash' unicode... > </symbol>

Bu XML veri aslında bu gibi okur anlamına gelir:

<forenames>NIELS B<symbol name='Oslash' unicode='00D8'
     type='html' glyph='@Oslash;' description='capital O, slash' 
     ascii='O' > </symbol>IE</forenames>

... Hangi tarayıcınızda gösterilmesini değil açıklıyor. Çevresinde yolu, tüm <symbol> öğeleri için XML belge aramak unicode parametresini okumak ve onları değiştirmek olacaktır.


Ona ayrıca baktığımızda, DTD üstündeki yorumları bunlar durumda insanlara kabul ettik göstermek! <symbol> etiketi glyph özellik bu simge için kullanmak standart HTML varlıktır, ama bir @ yerini işareti ile.

10 read xml document
20 search for any <symbol> element
30 read the "glyph" attribute
40 remove the <symbol> element
50 replace the @ with an & in glyph
60 write that in the place of <symbol>
70 goto 20

Eğer orada bir XML dosyası ile kullandığınız DTD oslash varlık içermiyor. Böyle XML ayrıştırıcı sadece Ø ile ne yapacağını bilmiyor gibi ve karışıklık ve / veya neşe gelişir.

Adını kuruluşlar (apos, lt, gt, quot, amp) ve XML'in kavramından adlı kişilerin HTML'ın kavramını (oslash parçası olduğu) ayırmak için önemlidir. HTML değil, temelde, hiçbir oslash azından genel durumda, bazı DTD'lerle bu olabilir, ama size tüm istediğiniz karakter olmayabilir (var.

Diğer bir deyişle; her zaman UTF-8 kullanmak. Hep.

EDIT: Ø de, latin-1 olduğunu.

Eğer doğru kodlamayı varsa &Oslash; (Ø) kaçmak için ihtiyacım yok. Emin olmak için unicode kullanmaya çalışın.

HTML varlıkları atlanmaması deneyin davranışı değiştirmek için bir yolu varsa, PHP kılavuzunu kontrol.

Bunu almak yerine yankı ben kullanıcı var_dump eğer tamam, biraz daha var:

object(SimpleXMLElement)[22]
  public 'symbol' => 
  object(SimpleXMLElement)[21]
  public '@attributes' => 
    array
      'name' => string 'Oslash' (length=6)
      'unicode' => string '00D8' (length=4)
      'type' => string 'html' (length=4)
      'glyph' => string '@Oslash;' (length=8)
      'description' => string 'capital O, slash' (length=16)
      'ascii' => string 'O' (length=1)
  string ' ' (length=1)

Ben Önadlardan içeriği ile birlikte tam bir dize yapmak için kullanabilirsiniz nasıl acaba