【发布时间】:2015-02-13 16:03:00
【问题描述】:
我搜索了很久,尝试了很多!但我无法为这个完全简单的场景敞开心扉。我需要说我是一个 python 新手,但是一个非常好的 bash 编码器;o) 我已经用 python 编写了一些代码,但也许还有很多我需要学习的东西,所以不要对我太苛刻;o) 我'愿意学习,我阅读了 python 文档和许多示例,并自己尝试了很多,但现在我正处于我在黑暗中挑选的地步..
我解析作为 XML 提供的内容。它大约 20-50 MB 大。 我的 XML 示例:
<MAIN>
<NOSUBEL>abcd</NOSUBEL>
<NOSUBEL2>adasdasa</NOSUBEL2>
<MULTISUB>
<WHATEVER>
<ANOTHERSUBEL>
<ANOTHERONE>
(how many levels can not be said / can change)
</ANOTHERONE>
</ANOTHERSUBEL>
</WHATEVER>
</MULTISUB>..
<SUBEL2>
<FOO>abcdefg</FOO>
</SUBEL2>
<NOSUBEL3>abc</NOSUBEL3>
...
and so on
</MAIN>
这是解析它的主要部分(如果您需要更多详细信息,请询问):
from lxml import etree
resp = my.request(some call args)
xml = etree.XML(resp)
for element in xml.findall(".//MAIN"):
# this works fine but is not generic enough:
my_dict = OrderedDict()
for only1sub in element.iter(tag="SUBEL2"):
for i in only1sub:
my_dict[i.tag] = i.text
这与 1 个子元素一起工作得很好,但这意味着我需要知道树中哪个有子元素,哪个没有。这可能会在未来发生变化或被添加。 另一个问题是 MULTISUB。使用上面的代码,我只能解析到第一个标签。
目标
我想要实现的目标是 - 充其量:
A) 有一个函数/代码 sn-p 能够解析整个 XML 内容,如果有一个子元素(例如,使用“if len(x)”或其他)然后解析到下一个级别,直到你到达没有子元素/树的级别。然后继续B)
B) 对于每个找到的没有子元素的 XML 标记,我想用标记名称和标记文本更新字典。
C) 我想对所有可用元素执行此操作 - 标签和直接子标签名称(例如“NOSUBEL2”或“MULTISUB”)将不会(经常)更改,因此它将是可以将它们用作解析的起点。
到目前为止,我尝试的是链接几个循环,例如 for 和 while 以及 for again 等等,但没有一个是完全成功的。我还潜入了 python 生成器,因为我认为我可以用 next() 函数做点什么,但什么也做不了。但同样,我可能不知道正确使用它们,所以我很高兴每个答案..
最后,我相信我需要的东西是如此简单。我只想从标签名称和标签内容中获得键值对,这不是那么难吗?任何帮助都非常感谢..
你能帮我实现目标吗?
(感谢您阅读到这里!)
【问题讨论】: