5

我正在循环一些 XML 文件并生成我想存储在 defaultdict(list) 类型中的树。每个循环和找到的下一个孩子将存储在字典的单独部分中。

d = defaultdict(list)
counter = 0
for child in root.findall(something):
    tree = ET.ElementTree(something)
    d[int(x)].append(tree)
    counter += 1

因此,对多个文件重复此操作会产生很好的索引结果;一组位于不同解析文件中位置 1 的树,依此类推。问题是,我如何加入所有的d,并将树(作为累积树)写入文件?

我可以遍历字典来获取每棵树:

for x in d:
    for y in d[x]:
        print (y)

这给出了我的字典中的树的完整列表。现在,我如何从中产生一棵巨大的树?

示例输入文件 1

示例输入文件 2

1&2 所需的结果

鉴于这样做的明显困难,我很高兴接受更一般的答案,这些答案表明我如何才能从两个或更多文件中获得我正在寻找的结果。

4

2 回答 2

2

使用 Spyne:

from spyne.model.primitive import *
from spyne.model.complex import *

class GpsInfo(ComplexModel):
    UTC = DateTime
    Latitude = Double
    Longitude = Double
    DopplerTime = Double
    Quality = Unicode
    HDOP = Unicode
    Altitude = Double
    Speed = Double
    Heading = Double
    Estimated = Boolean

class Header(ComplexModel):
    Name = Unicode
    Time = DateTime
    SeqNo = Integer

class CTrailData(ComplexModel):
    index = UnsignedInteger
    gpsInfo = GpsInfo
    Header = Header

class CTrail(ComplexModel):
    LastError = AnyXml
    MaxTrial = Integer
    Trail = Array(CTrailData)

from lxml import etree
from spyne.util.xml import *

file_1 = get_xml_as_object(etree.fromstring(open('file1').read()), CTrail)
file_2 = get_xml_as_object(etree.fromstring(open('file2').read()), CTrail)
file_1.Trail.extend(file_2.Trail)
file_1.Trail.sort(key=lambda x: x.index)

elt = get_object_as_xml(file_1, no_namespace=True)
print etree.tostring(elt, pretty_print=True)

在执行此操作的同时,Spyne 还将数据字段从字符串转换为其本机 Python 格式,因此您可以更轻松地处理来自该 xml 文档的数据。

此外,如果您不介意使用 git 的最新版本,您可以执行以下操作:

class GpsInfo(ComplexModel):
    # (...)
    doppler_time = Double(sub_name="DopplerTime")
    # (...)

这样您就可以从 CamelCased 标签中获取数据,而不必违反 PEP8。

于 2013-10-28T23:39:19.120 回答
2

使用 lxml.objectify:

from lxml import etree, objectify

obj_1 = objectify.fromstring(open('file1').read())
obj_2 = objectify.fromstring(open('file2').read())
obj_1.Trail.CTrailData.extend(obj_2.Trail.CTrailData)
# .sort() won't work as objectify's lists are not regular python lists.
obj_1.Trail.CTrailData = sorted(obj_1.Trail.CTrailData, key=lambda x: x.index)

print etree.tostring(obj_1, pretty_print=True)

它不会像 Spyne 变体那样做额外的转换工作,但对于您的用例来说,这可能就足够了。

于 2013-10-29T16:01:17.660 回答