Вопрос

Я написал небольшую функцию, которая использует ElectionTree и 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)

Третий тест терпит неудачу со следующим исключением:

ИСПАРТРОР: Ссылка на недействительный номер символа: Линия 1, столбец 13

Это &#0; Предприятие нелегальный XML? Независимо от того, есть ли он или нет, файлы, которые я хочу разобрать, содержать его, и мне нужен какой-то способ разбирать их. Любые предложения для другого анализатора, чем Expat, или настроек для Expat, это позволило бы мне сделать это?


Обновление: я обнаружил BeautifulSoup Только сейчас, прогулочный паршский парсер, как указано ниже в комментарии к ответу, и для удовольствия я вернулся к этой проблеме и пытался использовать его в качестве XML-уборщика перед ElectionTree, но все это преобразовано &#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 как таковой, я мог бы пойти с самой красивой самих и его довольно простым узел. parsed_tree.test.elem1.contents[0].

Это было полезно?

Решение

&#0; не в Правовой диапазон характера определяется спецификацией XML. Увы, мои навыки Python довольно элементарны, поэтому я не могу там.

Другие советы

&#0; не является действительным символом XML. В идеале вы сможете получить создатель файла, чтобы изменить свой процесс, чтобы файл был недействительным, таким образом.

Если вы должны принять эти файлы, вы можете предварительно обработать их, чтобы повернуть &#0 во что-то другое. Например, выберите @ как эвакуатор, поворачивайте «@» в «@@» и "&#0;«В» @ 0 ".

Затем, когда вы получаете текстовые данные из парсера, вы можете поменять отображение. Это всего лишь пример, вы можете изобрести любой убежитель синтаксиса, который вам нравится.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top