Получение структуры данных, эквивалентной asXML() в pyparsing?

Я узнал, что в pyparsing вы можете назвать элемент/группу/узел следующим образом:

token = pyparsing.Literal("Foobar")("element_name_here")

Итак, я сделал пример программы, чтобы проверить это:

import pyparsing as pp

Prefix = pp.Word(pp.nums)("Prefix")
Name = pp.Literal("FOOBAR")("Name")
Modifier = pp.Word(pp.alphas)("Modifier")
Modifier_Group = pp.Group(pp.OneOrMore(Modifier))("Modifier_Group")
Sentence = pp.Group(pp.Optional(Prefix) + Name + Modifier_Group)("Sentence")

out = Sentence.parseString("123 FOOBAR testA testB")

Затем я попытался получить результат с помощью этих именованных токенов.

Я пробовал это:

>>> print out
[['123', 'FOOBAR', ['testA', 'testB']]]

... но это не дает мне имен токенов.

Затем я попытался сделать следующее:

>>> print out.items()
[('Sentence', (['123', 'FOOBAR', (['testA', 'testB'], {'Modifier': [('testA', 0), 
('testB', 1)]})], {'Modifier_Group': [((['testA', 'testB'], {'Modifier': [('testA', 0),
('testB', 1)]}), 2)], 'Prefix': [('123', 0)], 'Name': [('FOOBAR', 1)]}))]

>>> print dict(out)

{'Sentence': (['123', 'FOOBAR', (['testA', 'testB'], {'Modifier': [('testA', 0), 
('testB', 1)]})], {'Modifier_Group': [((['testA', 'testB'], {'Modifier': [('testA', 0),
('testB', 1)]}), 2)], 'Prefix': [('123', 0)], 'Name': [('FOOBAR', 1)]})}

>>> import collections
>>> print collections.OrderedDict(out)
OrderedDict([('Sentence', (['123', 'FOOBAR', (['testA', 'testB'], {'Modifier': [
('testA', 0), ('testB', 1)]})], {'Modifier_Group': [((['testA', 'testB'], 
{'Modifier': [('testA', 0), ('testB', 1)]}), 2)], 'Prefix': [('123', 0)], 
'Name': [('FOOBAR', 1)]}))])

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

>>> print out.asXML()
<Sentence>
  <Sentence>
    <Prefix>123</Prefix>
    <Name>FOOBAR</Name>
    <Modifier_Group>
      <Modifier>testA</Modifier>
      <Modifier>testB</Modifier>
    </Modifier_Group>
  </Sentence>
</Sentence>

... и это дало мне ИМЕННО то, что я хотел, за исключением того, что это в XML, а не в структуре данных Python, которой я могу легко манипулировать. Есть ли способ получить такую ​​структуру данных (без разбора XML)?

Я нашел решение, которое возвращает вложенный словарь, но dicts в python неупорядочены (и я хочу, чтобы токены были в порядке), поэтому для меня это не решение.


person Michael0x2a    schedule 21.07.2012    source источник


Ответы (1)


Pyparsing возвращает объект ParseResults, который уже дает вам эту структуру. Вы можете визуализировать структуру предложения, напечатав out.dump():

>>> print out.dump()
[['123', 'FOOBAR', ['testA', 'testB']]]
- Sentence: ['123', 'FOOBAR', ['testA', 'testB']]
  - Modifier_Group: ['testA', 'testB']
    - Modifier: testB
  - Name: FOOBAR
  - Prefix: 123

Вы можете получить доступ к этим элементам, как если бы они были ключами в словаре:

>>> print out.Sentence.keys()
['Modifier_Group', 'Prefix', 'Name']
>>> print out.Sentence['Prefix']
123

или как атрибуты объекта:

>>> print out.Sentence.Name
FOOBAR
>>> print out.Sentence.Prefix
123
person PaulMcG    schedule 21.07.2012