2010-10-23 2 views
3

Мне нужно разобрать XML-документ, а затем записать каждый узел для разделения файлов, сохраняя точный порядок атрибутов. Так что, если у меня есть входной файл, как:XML-синтаксический анализатор, сохраняющий порядок атрибутов

<item a="a" b="b" c="c"/> 
<item a="a1" b="b2" c="c3"/> 

Вывод должен быть 2 файла с каждым элементом. Теперь, если xml.dom.minidom используется - порядок атрибутов изменяется на выходе (я могу получить - <item b="b" c="c" **a="a"**/>).

Я нашел pxdom Lib, он сохраняет порядок, но очень-очень медленно (minidom синтаксический анализ занимает 0,08 сек, pxdom разбор занимает 2,5 сек.)

Есть ли еще библиотеки python, которые могут сохранять атрибуты?

UPD: libarry также должен содержать верхний и нижний регистры. Таким образом, "Пункт" не равно "пункт"

+0

Общий консенсус в том, что порядок атрибутов не имеет значения. Зачем вам их заказывать? – delnan

+0

Это не мое желание. К сожалению, GDS (глобальная система распределения), с которой я работаю, требует точного соответствия порядка атрибутов. – Andrew

ответ

1

Вы могли бы найти this question полезным. Краткое резюме - стандартные инструменты и библиотеки xml, скорее всего, не смогут этого сделать.

+0

спасибо, я видел, что Q, pxdom делает это, но очень очень медленно. в общем случае проблема заключается в том, чтобы найти библиотеку, которая использует список (вместо dict) в качестве хранилища для attrs. – Andrew

+0

. Библиотека, которая делает это, должна будет хранить как dict, так и список для отображения и порядка. Или, возможно, OrderedDict. Я пробовал этот сценарий с помощью 'lxml' перед отправкой этого ответа, и независимо от того, сколько добавленных атрибутов я добавил, ключи * всегда были в порядке, указанном в XML-файле. Но я не знаю, гарантировано ли это. – snapshoe

0

Вы можете использовать BeautifulSoup:

>>> from BeautifulSoup import BeautifulSoup as soup 

>>> html = '''<item a="a" b="b" c="c"/> 
<item a="a1" b="b2" c="c3"/>''' 
>>> s = soup(html) 
>>> s.findAll('item') 
[<item a="a" b="b" c="c"></item>, <item a="a1" b="b2" c="c3"></item>] 
+1

К сожалению, BeautifulSoup меняет все узлы на нижний регистр. и кажется, что beatifulsoup не может быть чувствительным к делу – Andrew

+0

А ты прав! – rubik

+1

вы можете сохранить регистр букв, выбрав для синтаксического анализа XML: например. s = soup (html, "xml") – RaamEE