python - 合并具有相似父节点的子节点,xml,python

标签 python xml

我有以下 xml 文件:

<root>
    <article_date>09/09/2013
    <article_time>1
        <article_name>aaa1</article_name>
        <article_link>1aaaaaaa</article_link>
    </article_time>
    <article_time>0
        <article_name>aaa2</article_name>
        <article_link>2aaaaaaa</article_link>
    </article_time>
    <article_time>1
        <article_name>aaa3</article_name>
        <article_link>3aaaaaaa</article_link>
    </article_time>
    <article_time>0
        <article_name>aaa4</article_name>
        <article_link>4aaaaaaa</article_link>
    </article_time>
    <article_time>1
        <article_name>aaa5</article_name>
        <article_link>5aaaaaaa</article_link>
    </article_time>
    </article_date>
</root>

我想将其转换为以下文件:

<root>
    <article_date>09/09/2013
    <article_time>1
        <article_name>aaa1+aaa3+aaa5</article_name>
        <article_link>1aaaaaaa+3aaaaaaa+5aaaaaaa</article_link>
    </article_time>
    <article_time>0
        <article_name>aaa2+aaa4</article_name>
        <article_link>2aaaaaaa+4aaaaaaa</article_link>
    </article_time>
</root>

我怎样才能在 python 中做到这一点?

我执行此任务的方法如下: 1)循环标签 2) 形成字典键 - 0 或 1,值 - 3) 对于这个字典中的每个元素,找到所有子节点:并追加它们

从那以后,我写了下面的代码来实现这个(ps我目前正在努力向字典添加元素,但我会克服这个问题):

def parse():
list_of_inique_timestamps=[]
text_to_merge=""
tree=et.parse("~/Documents/test1.xml")
root=tree.getroot()
for children in root:
    print children.tag, children.text
    for child in children:
        print (child.tag,int(child.text))
        if not child.text in list_of_inique_timestamps:
            list_of_inique_timestamps.append(child.text)
print list_of_inique_timestamps

最佳答案

这是使用 python 标准库中的 xml.etree.ElementTree 的解决方案。

想法是根据 article_time 文本值将项目收集到 defaultdict(list) 中:

from collections import defaultdict
import xml.etree.ElementTree as ET

data = """<root>
    <article_date>09/09/2013
    <article_time>1
        <article_name>aaa1</article_name>
        <article_link>1aaaaaaa</article_link>
    </article_time>
    <article_time>0
        <article_name>aaa2</article_name>
        <article_link>2aaaaaaa</article_link>
    </article_time>
    <article_time>1
        <article_name>aaa3</article_name>
        <article_link>3aaaaaaa</article_link>
    </article_time>
    <article_time>0
        <article_name>aaa4</article_name>
        <article_link>4aaaaaaa</article_link>
    </article_time>
    <article_time>1
        <article_name>aaa5</article_name>
        <article_link>5aaaaaaa</article_link>
    </article_time>
    </article_date>
</root>
"""

tree = ET.fromstring(data)

root = ET.Element('root')
article_date = ET.SubElement(root, 'article_date')
article_date.text = tree.find('.//article_date').text

data = defaultdict(list)
for article_time in tree.findall('.//article_time'):
    text = article_time.text.strip()
    name = article_time.find('./article_name').text
    link = article_time.find('./article_link').text
    data[text].append((name, link))

for time_value, items in data.iteritems():
    article_time = ET.SubElement(article_date, 'article_time')
    article_name = ET.SubElement(article_time, 'article_name')
    article_link = ET.SubElement(article_time, 'article_name')

    article_time.text = time_value
    article_name.text = '+'.join(name for (name, _) in items)
    article_link.text = '+'.join(link for (_, link) in items)

print ET.tostring(root)

打印(美化):

<root>
    <article_date>09/09/2013
        <article_time>1
            <article_name>aaa1+aaa3+aaa5</article_name>
            <article_name>1aaaaaaa+3aaaaaaa+5aaaaaaa</article_name>
        </article_time>
        <article_time>0
            <article_name>aaa2+aaa4</article_name>
            <article_name>2aaaaaaa+4aaaaaaa</article_name>
        </article_time>
    </article_date>
</root>

看,结果正是您想要的。

关于python - 合并具有相似父节点的子节点,xml,python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22767444/

相关文章:

python - 为什么在 GPU 上创建 Theano 共享变量会影响 numpy 的随机流?

c++ - 试图理解 GCC-XML 输出变量的含义

xml - 在 xsd 中使用 ="optional"是多余的吗?

Perl 中的 XML Pull 解析器实现?

android - 设置样式android :windowIsTranslucent seems to conflict with windowAnimationStyle

python - 如何使用带有 PYTHON 的 Selenium 驱动程序获取 http 响应?

python -/usr/bin/ld : cannot find -lpython3. 5m

python - 如何从python中的dll加载具有自定义接口(interface)的COM对象?

python - 数据表 python flask

java - 让 GWT 应用程序与本地客户端进程通信