الحصول على المغتربين للاستخدام .DTD لاستبدال الكيان في بيثون

StackOverflow https://stackoverflow.com/questions/2881991

سؤال

أحاول القراءة في ملف XML الذي يشبه هذا

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<incollection>
<author>Jos&eacute; A. Blakeley</author>
</incollection>
</dblp>

النقطة التي تخلق المشكلة هي

Jos&eacute; A. Blakeley

الجزء: يدعو المحللون معالج الشخصيات مرتين ، مرة واحدة مع "Jos" ، مرة واحدة مع "A. Blakeley". الآن أفهم أن هذا قد يكون السلوك الصحيح إذا لم يكن يعرف كيان eacute. ومع ذلك ، يتم تعريف هذا في dblp.dtd ، الذي لدي. لا يبدو أنني قادر على إقناع المغتربين باستخدام هذا الملف. كل ما يمكنني قوله هو

p = xml.parsers.expat.ParserCreate()
# tried with and without following line
p.SetParamEntityParsing(xml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS) 
p.UseForeignDTD(True)
f = open(dblp_file, "r")
p.ParseFile(f)

لكن المغترب لا يزال لا يتعرف على كياني. لماذا لا توجد طريقة لإخبار المغتربين أي DTD لاستخدامه؟ لقد حاولت

  • وضع الملف في نفس الدليل مثل XML
  • وضع الملف في دليل عمل البرنامج
  • استبدال المرجع في ملف XML عن طريق مسار مطلق

ماذا ينقصني؟ شكرًا.

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

المحلول

كما أفهمها ، إذا كنت تستخدم pyexpat مباشرة ، فعليك أن تقدم الخاصة بك ExternalEntityRefHandler لجلب DTD الخارجي وإطعامه إلى المغتربين.

انظر على سبيل المثال. xml.sax.expatreader على سبيل المثال الرمز (الطريقة external_entity_ref, ، الخط 374 في بيثون 2.6).

من المحتمل أن يكون من الأفضل استخدام واجهة عالية المستوى مثل SAX (عبر expatreader) إذا استطعت.

نصائح أخرى

راجع للشغل يمكنني أن أساعد نفسي مؤقتًا عن طريق نسخ الأجزاء ذات الصلة من .DTD في ملف XML نفسه ، كما في

<!DOCTYPE dblp [
    <!ENTITY Agrave  "&#192;" >
]>

لكن هذا لا يحل المشكلة بطريقة عامة.

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