我想在返回之前向ParseResults添加外部信息。我将解析结果返回为asXML()。外部数据表示为字典,以便在最终解析中解析为XML。
这是添加外部数据之前的代码 来自pyparsing import *
# a hypothetical outer parser, with an unparsed SkipTo element
color = oneOf("red orange yellow green blue purple")
expression = SkipTo("XXX") + Literal("XXX").setResultsName('ex') + color.setResultsName('color')
data = "JUNK 100 200 10 XXX green"
print expression.parseString(data).dump()
# main grammar
def minorgrammar(toks):
# a simple inner grammar
integer = Word(nums)
grammar2 = integer("A").setResultsName('A') + integer("B").setResultsName('B') + integer("C").setResultsName('C')
# use scanString to find the inner grammar
# (since we just want the first occurrence, we can use next
# instead of a for loop with a break)
t,s,e = next(grammar2.scanString(toks[0],maxMatches=1))
# remove 0'th element from toks
del toks[0]
# return a new ParseResults, the sum of t and everything
# in toks after toks[0] was removed
return t + toks
grammar1 = expression.setParseAction(minorgrammar)
x = grammar1.parseString(data).asXML("main")
print x
输出
<main>
<A>100</A>
<B>200</B>
<C>10</C>
<ex>XXX</ex>
<color>green</color>
</main>
添加外部数据后的代码
...
external_data = {'name':'omar', 'age':'40'}
return t + toks + ParseResults(external_data)
grammar1 = expression.setParseAction(minorgrammar)
x = grammar1.parseString(data).asXML("main")
print x
<main>
<A>100</A>
<B>200</B>
<C>10</C>
<ex>XXX</ex>
<color>green</color>
<ITEM>{'age': '40', 'name': 'omar'}</ITEM>
</main>
我希望输出格式为
<main>
<A>100</A>
<B>200</B>
<C>10</C>
<ex>XXX</ex>
<color>green</color>
<name>omar</name>
<age>40</age>
</main>
该代码中的错误是什么? Thans
答案 0 :(得分:0)
这个片段存在一个问题:
external_data = {'name':'omar', 'age':'40'}
return t + toks + ParseResults(external_data)
ParseResults将dict作为构造函数参数,但我不认为它会按照你想要的那样做 - 它只是将dict指定为第0个元素,并且不会指定任何结果名称。
你可以通过使用其dict风格的赋值将命名值分配到ParseResults中:
pr = ParseResults(['omar','40'])
for k,v in external_data.items():
pr[k] = v
看看这是否让您更接近您想要的格式。
编辑:嗯,似乎XML更加挑剔如何将命名结果添加到ParseResults,而不仅仅是设置名称。这会更好:
def addNamedResult(pr, value, name):
addpr = ParseResults([value])
addpr[name] = value
pr += addpr
然后在您的解析操作中,使用以下命令添加值及其名称:
addNamedResult(toks, 'omar', 'name')
addNamedResult(toks, '40', 'age')
答案 1 :(得分:0)
非常感谢保罗。我修改了你的函数以添加数据字典
...
external_data = {'name':'omar', 'age':'40'}
return t + toks + addDicResult(external_data)
...
def addDicResult(dict):
pr = ParseResults([])
for k, v in dict.items():
addpr = ParseResults([v])
addpr[k] = v
pr += addpr
return pr
The output
<main>
<A>100</A>
<B>200</B>
<C>10</C>
<ex>XXX</ex>
<color>green</color>
<age>40</age>
<name>omar</name>
</main>