سؤال

أنا أستخدم elertree لتحليل ملف XML. في بعض الحقول، سيكون هناك بيانات HTML. على سبيل المثال، النظر في إعلان على النحو التالي:

<Course>
    <Description>Line 1<br />Line 2</Description>
</Course>

الآن، يفترض أن _COUSE هو متغير عنصر يمسك عنصر الأزمة هذا. أريد الوصول إلى وصف هذه الدورة التدريبية، لذلك أفعل:

desc = _course.find("Description").text;

ولكن بعد ذلك يحتوي DESC فقط على "السطر 1". قرأت شيئا عن سمة .tail، لذلك حاولت أيضا:

desc = _course.find("Description").tail;

وأحصل على نفس الإخراج. ماذا يجب أن أفعل لجعل desc يكون "خط 1
خط 2 "(أو حرفيا أي شيء بين)؟ بمعنى آخر، أبحث عن شيء مشابه للملكية .innertext في C # (والعديد من اللغات الأخرى التي أعتقدها).

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

المحلول

هل لديك أي تحكم في إنشاء ملف XML؟ محتويات علامات XML التي تحتوي على علامات XML (أو ما شابه ذلك)، أو رسوم ترميز ('<يجب ترميز "، إلخ) لتجنب هذه المشكلة. يمكنك القيام بذلك مع إما:

  • أ CDATA. الجزء
  • Base64 أو بعض الترميز الأخرى (التي لا تشمل الأحرف المحملة XML)
  • تشفير الكيان ('<' == '&lt;')

إذا لم تتمكن من إجراء هذه التغييرات، فلا يمكن ل Elemertree تجاهل العلامات غير المدرجة في مخطط XML، فسيتعين عليك معالجة الملف مسبقا. بالطبع، أنت محظوظ إذا كان المخطط يتداخل HTML.

نصائح أخرى

تحاول قراءة سمة الذيل من العنصر الخطأ. يحاول

desc = _course.find("br").tail;

يتم استخدام سمة الذيل لتخزين العقدات النصية الزائدة عند قراءة ملفات XML مختلطة المحتوى؛ يتم تخزين النص الذي يتبع مباشرة بعد تخزين عنصر في سمة الذيل لهذا العنصر:

 u003Ctag>u003Celem>هذا يدخل في سمة النص elemu003C/elem> هذا يذهب إلى سمة إيليم الذيلu003C/tag>

مقتطف رمز بسيط لطباعة نصات النص والذيل من جميع العناصر في XML / XHTML.

استيراد xml.etree.etree.lementtree كما et def proctionelem (elem): إذا elem.text ليس بلا: طباعة elem.text للطفلة في elem: processelem (child) إذا كان الطفل. الأطيل ليس بلا: طباعة child.tail xml = ' "u003CCourse>u003CDescription> خط 1u003Cbr /> خط 2 u003Cspan>الطفل نصu003C/span> الطفل الذيلu003C/Description>u003C/Course> '' الجذر = et.fromstring (xml) processelem (الجذر)

انتاج:

خط 1 خط 2 الطفل النص الذيل الطفل

يرى http:/code.activestate.com/recipes/498286-elementtree-text-helper/ لحل أفضل. يمكن تعديلها لتناسب.

سكرتير خاص لقد غيرت اسمي من User839338 كما هو مقتبس في المنشور التالي

الأحرف مثل "<" و "&" غير قانوني في عناصر XML.

سيقوم "<" بإنشاء خطأ لأن المحلل المحلل يفسره كبدء عنصر جديد.

"&" سيقوم بإنشاء خطأ لأن المحلل المحلل يفسره كبدء كيان حرف.

يحتوي بعض النص، مثل رمز JavaScript، على الكثير من الأحرف "<" أو "&". لتجنب الأخطاء يمكن تعريف رمز البرنامج النصي على أنها CDATA.

يتم تجاهل كل شيء داخل قسم CDATA من قبل المحلل المحلل.

يبدأ قسم CDATA ب "":

مزيد من المعلومات حول: http://www.w3schools.com/xml/xml_cdata.asp.

أتمنى أن يساعدك هذا!

مستوحاة من إجابة user839338, ، لم أكن ونظرت عن حل معقول، والتي تبدو كبيرة مثل هذا.

>>> from xml.etree import ElementTree as etree
>>> corpus = '''<Course>
...     <Description>Line 1<br />Line 2</Description>
... </Course>'''
>>> 
>>> doc = etree.fromstring(corpus)
>>> desc = doc.find("Description")
>>> desc.tag = 'html'
>>> etree.tostring(desc)
'<html>Line 1<br/>Line 2</html>\n'
>>> 

ليس هناك طريقة بسيطة للقضاء على العلامة المحيطة (في الأصل <Description>)، ولكن يتم تعديلها بسهولة في شيء يمكن استخدامه حسب الحاجة، على سبيل المثال <div> أو <span>

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