الحصول على المغتربين للاستخدام .DTD لاستبدال الكيان في بيثون
-
04-10-2019 - |
سؤال
أحاول القراءة في ملف XML الذي يشبه هذا
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<incollection>
<author>José A. Blakeley</author>
</incollection>
</dblp>
النقطة التي تخلق المشكلة هي
José 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 "À" >
]>
لكن هذا لا يحل المشكلة بطريقة عامة.