سؤال

وأنا أحاول تحليل ملف XML التالية:

<?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>

في البداية لن تحميل، ولكن الآن لدي كود الذي يبدو على الأقل لاستخدام DTD لمعرفة كيان مثل &Oslash; (Ø)، ولكن المشكلة التالية هي أنه لا تظهر حرف في الانتاج.

وهذا هو بلدي توزيع التعليمات البرمجية:

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

وهذا هو الإخراج:

وNIELS BIE

وحاولت ذلك مع DOM XML تحليل للغاية، ومن ثم كان إخراج NIELS B IE (حتى مع الفضاء ..)

وأي أفكار؟

هل كانت مفيدة؟

المحلول

وإذا نظرنا إلى DTD، تقول هذا (ولكن بدون فواصل الأسطر):

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

لأي قارئ XML باستخدام هذا DTD، وهذا يعني "كلما رأيت هذا المزيج الدقيق للرسائل في مصدر: &Oslash;، والاستعاضة عنها هذا النص: <symbol name='Oslash' unicode... > </symbol>

وهذا يعني أن البيانات XML يقرأ فعلا مثل هذا:

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

... وهو ما يفسر السبب في انه لا تظهر في المتصفح الخاص بك. ان الطريق نحو أن يكون للبحث وثيقة XML لجميع العناصر <symbol>، قراءة المعلمة unicode واستبدالها ذلك.


وتبحث زيادة على ذلك، فإن التعليقات على الجزء العلوي من DTD تبين أنها قد نظرت الناس في وضعك! السمة glyph على البطاقة <symbol> هي كيان HTML القياسية لاستخدامها لهذا الرمز، ولكن مع العطف استبدال مع @.

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

نصائح أخرى

ووDTD كنت تستخدم مع ملف XML الخاصة بك هناك لا يحتوي على كيان Oslash. على هذا النحو محلل XML ببساطة لا يعرف ماذا يفعل مع Ø والارتباك و / أو مرح تستتبعه.

ومن المهم أن تفصل فكرة HTML من الكيانات المسماة (التي Oslash جزء) من فكرة XML من الكيانات المسماة (أبوس]، ولتر، GT، مثل، أمبير). في الأساس، وإذا لم يكن HTML، وليس هناك Oslash (على الأقل في الحالة العامة، قد يكون لها بعض تدس ذلك، ولكن قد لا يكون الحرف الذي تريد على الإطلاق.

في الكلمات الأخرى؛ دائما استخدام UTF-8. دائما.

وتحرير: Ø هو في اللاتينية-1، أيضا

إذا كان لديك الترميز الصحيح لا تحتاج للهروب &Oslash; (Ø). محاولة استخدام يونيكود للتأكد.

وإذا كان هناك أي وسيلة لتغيير سلوك الكيانات محاولة HTML عدم استبعاد، راجع دليل PHP.

وطيب، وذهب الى أبعد قليلا، إذا كنت var_dump المستخدم بدلا من صدى أحصل على هذا:

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)

وأتساءل كيف يمكن استخدام ذلك لجعل سلسلة كاملة مع محتويات forenames

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top