使用python重塑xml?

2024-09-27 00:16:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个xml

<data>
    <B>Head1</B>
    <I>Inter1</I>
    <I>Inter2</I>
    <I>Inter3</I>
    <I>Inter4</I>
    <I>Inter5</I>
    <O>,</O>
    <B>Head2</B>
    <I>Inter6</I>
    <I>Inter7</I>
    <I>Inter8</I>
    <I>Inter9</I>
    <O>,</O>
    <O> </O>
</data>

我希望XML看起来像

 <data>
        <combined>Head1 Inter1 Inter2 Inter3 Inter4 Inter5</combined>,
        <combined>Head2 Inter6 Inter7 Inter8 Inter9</combined>
 </data>

我试着得到“B”的所有值

for value in mod.getiterator(tag='B'):
    print (value.text)

Head1
Head2

for value in mod.getiterator(tag='I'):
    print (value.text)

Inter1 
Inter2 
Inter3 
Inter4 
Inter5
Inter6 
Inter7 
Inter8 
Inter9

现在,我应该如何将第一个迭代值保存到一个标记中,然后将第二个值保存到different标记中。例如,如何使迭代从标记“B”开始,找到跟随它的所有标记“I”,如果我再次找到标记“B”并将它们全部保存在新标记中,则再次迭代。你知道吗

标签“O”将始终出现在末尾


Tags: 标记datavaluecombinedhead1head2inter2inter1
1条回答
网友
1楼 · 发布于 2024-09-27 00:16:47

您可以从xml.etree使用ElementTree模块:

from xml.etree import ElementTree

struct = """
<data>
{}
</data>
"""
def reformat(tree):
    root = tree.getroot()
    seen = []
    for neighbor in root.iter('data'):
        for child in neighbor.getchildren():
            tx = child.text
            if tx == ',':
                yield "<combined>{}<combined>".format(' '.join(seen))
                seen = []
            else:
                seen.append(tx)

with open('test.xml') as f:
    tree = ElementTree.parse(f)

print(struct.format(',\n'.join(reformat(tree))))

结果:

<data>
<combined>Head1 Inter1 Inter2 Inter3 Inter4 Inter5<combined>,
<combined>Head2 Inter6 Inter7 Inter8 Inter9<combined>
</data>

请注意,如果您不确定所有的块都是用逗号分隔的,您只需根据您的文件格式更改条件if tx == ',':。您还可以检查tx何时以'Head'开头,如果seen不是空的yieldseen并清除其内容,否则附加tx并继续。你知道吗

相关问题 更多 >

    热门问题