سؤال

لقد كتبت وظيفة صغيرة ، تستخدم ElementTree و XPath لاستخراج محتويات النص لعناصر معينة في ملف XML:

#!/usr/bin/env python2.5

import doctest
from xml.etree import ElementTree
from StringIO import StringIO

def parse_xml_etree(sin, xpath):
  """
Takes as input a stream containing XML and an XPath expression.
Applies the XPath expression to the XML and returns a generator
yielding the text contents of each element returned.

>>> parse_xml_etree(
...   StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
...   '//elem1').next()
'one'
>>> parse_xml_etree(
...   StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
...   '//elem2').next()
'two'
>>> parse_xml_etree(
...   StringIO('<test><null>&#0;</null><elem3>three</elem3></test>'),
...   '//elem2').next()
'three'
"""

  tree = ElementTree.parse(sin)
  for element in tree.findall(xpath):
    yield element.text  

if __name__ == '__main__':
  doctest.testmod(verbose=True)

فشل الاختبار الثالث مع الاستثناء التالي:

Expaterror: إشارة إلى رقم الحرف غير صالح: السطر 1 ، العمود 13

هل &#0; الكيان غير القانوني XML؟ بغض النظر عما إذا كان الأمر كذلك أم لا ، فإن الملفات التي أريد تحليلها تحتوي عليها ، وأحتاج إلى بعض الشيء لتحليلها. أي اقتراحات لمحلل آخر من المغتربين ، أو إعدادات المغتربين ، من شأنها أن تسمح لي بالقيام بذلك؟


تحديث: اكتشفت جميل الآن فقط ، محلل حساء العلامة كما هو مذكور أدناه في تعليق الإجابة ، وللمتعة ، عدت إلى هذه المشكلة وحاولت استخدامها كقائد XML أمام Elementtree ، لكنها حولت بشكل مسيء &#0; في بايت فارغ فقط. :-)

cleaned_s = StringIO(
  BeautifulStoneSoup('<test><null>&#0;</null><elem3>three</elem3></test>',
                     convertEntities=BeautifulStoneSoup.XML_ENTITIES
  ).renderContents()
)
tree = ElementTree.parse(cleaned_s)

... عائدات

xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 12

في حالتي الخاصة ، لم أكن بحاجة حقًا إلى تحليل XPath على هذا النحو ، كان بإمكاني الذهاب مع BeautifulSoup نفسه وأسلوب التمثيل في العقدة البسيطة جدًا parsed_tree.test.elem1.contents[0].

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

المحلول

&#0; ليس في نطاق الشخصية القانونية المحددة بواسطة مواصفات XML. للأسف ، مهاراتي في بيثون بدائية إلى حد ما ، لذلك أنا لا أساعد كثيرًا هناك.

نصائح أخرى

&#0; ليس حرف XML صالح. من الناحية المثالية ، ستكون قادرًا على الحصول على منشئ الملف لتغيير عمليته بحيث لم يكن الملف غير صالح مثل هذا.

إذا كان يجب عليك قبول هذه الملفات ، فيمكنك إجراء معالجة مسبقًا للتشغيل &#0 في شيء آخر. على سبيل المثال ، اختر@كحرف الهروب ، قم بتحويل "@" إلى "@" ، و "و"&#0;"في"@0 ".

ثم عندما تحصل على بيانات النص من المحلل ، يمكنك عكس التعيين. هذا مجرد مثال ، يمكنك اختراع أي بناء جملة هروب تريده.

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