lxml XMLSyntaxError: префикс пространства имен по умолчанию не найден

Я использую lxml для чтения моего XML-файла. Я использую код, как показано ниже. Он отлично работает с lxml2.3 beta1, но с lxml2.3 выдает синтаксическую ошибку zn xml, как показано ниже. Я просмотрел примечания к выпуску для обеих версий, но не смог понять, что могло вызвать эту ошибку или как ее исправить. Пожалуйста, помогите, если вы сталкивались с такой вещью или имеете какие-либо подсказки по этому поводу.

Спасибо!!

Код:

from lxml import etree 
def parseXml(context,attribList,elemList):     
   for event, element in context:
       if element.tag in elemList:         
         #read element attributes 
   element.clear()

def main(object):
    ns='{NS}'
    attribList=['name','age','id'] 
    elemList=[ns+'Employee',ns+'Experience',ns+'Employment',ns+'Project',ns+'Award']
    context=etree.iterparse(fullFilePath, events=("start","end")) 
    parseXml(context,attribList,elemList)

Ошибка:

Файл "iterparse.pxi", строка 478, в lxml.etree.iterparse.далее (src/lxml/lxml.etree.c:95348) Файл "iterparse.pxi", строка 530, в lxml .etree.iterparse._read_more_events (src/lxml/lxml.etree.c:95886) Файл "parser.pxi", строка 585, в lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71955) XMLSyntaxError: Префикс пространства имен по умолчанию не найден, строка 545, столбец 73

образец xml -

<root xmlns='NS'>
 <Employee Name="Mr.ZZ" Age="30">
  <Experience TotalYears="10" StartDate="2000-01-01" EndDate="2010-12-12">
   <Employment id = "1" EndTime="ABC" StartDate="2000-01-01" EndDate="2002-12-12">
     <Project Name="ABC_1" Team="4">
     </Project>
   </Employment>
   <Employment id = "2" EndTime="XYZ" StartDate="2003-01-01" EndDate="2010-12-12">
    <PromotionStatus>Manager</PromotionStatus>
    <Project Name="XYZ_1" Team="7">
     <Award>Star Team Member</Award>
    </Project>
   </Employment>
  </Experience>
 </Employee>
</root> 

«Сотрудник» повторяется в корне. И ошибка возникает после того, как парсер прошел хоть у многих сотрудников правильно.

Редактировать 1: при захвате исключения я получаю следующее:

WARNING:NAMESPACE:NS_ERR_UNDEFINED_NAMESPACE: Namespace default prefix was not found

person Rinks    schedule 28.06.2011    source источник


Ответы (2)


Итак, я, наконец, понял, что происходит. Следуя хорошему совету по очистке используемых элементов, я очищал все элементы, включая корневой узел. Корневой узел — это узел с префиксом пространства имен по умолчанию, который применяется ко всем узлам в этом корне. Поскольку я очистил свой корневой узел, префикс пространства имен по умолчанию больше не был частью nsmap его подэлементов. Предыдущие версии, кажется, прощали это, но последняя версия была более строгой в этом смысле.

Отсутствие очистки корневого элемента до тех пор, пока я не закончу чтение xml, помогло мне.

person Rinks    schedule 30.06.2011

проблемы с пространством имен по умолчанию чаще всего возникают, когда вы пытаетесь использовать выражение xpath. Для простого синтаксического анализа потока, как в вашем образце, 2.3.0 должен нормально работать с безымянным пространством имен по умолчанию.

Возможно, вам следует опубликовать наименьший возможный XML-файл, который выдает эту ошибку (строка 545 находится довольно глубоко в файле, чтобы иметь эту ошибку)

person Phil Cooper    schedule 28.06.2011
comment
Спасибо за ответ Фил. Я добавил образец xml в свой исходный пост, а также отредактировал образец кода, чтобы показать, как я использую пространство имен. Я в основном сравниваю тег элемента, чтобы убедиться, что это то, что я ожидаю. В случае обнаружения неизвестного тега я регистрирую ошибку. Но здесь lxml просто выдает ошибку. Я проверил строку № 545, чтобы убедиться, что там что-то не так, но xml выглядит просто отлично (так и должно быть, так как он отлично работает с lxml 2.3 beta1). - person Rinks; 29.06.2011