Python:以编程方式创建一个xml文件,该文件以递归方式列出目录的所有内容

时间:2017-06-08 12:19:47

标签: xml python-3.x

我的目录结构如下所示。这里data class Notebook(var notes: List<String>) { init { notes = notes.toList() } } 是根目录,其中包含目录testaba还分别包含子目录ba1a2b1。此外,b2包含名为a1的文件。

我使用The ElementTree XML API为此结构创建了xml文件,如下所示。

text

上述程序的输出是

#!/usr/bin/env python3
import xml.etree.ElementTree as ET

test =  ET.Element('test')
a = ET.SubElement(test,'a')
a1 = ET.SubElement(a,'a1')
text = ET.SubElement(a1,'text')
a2 = ET.SubElement(a,'a2')
b = ET.SubElement(test,'b')
b1 = ET.SubElement(b,'b1')
b2 = ET.SubElement(b,'b2')
ET.dump(test)

但是,我需要以编程方式为任何给定目录生成xml。 这有可能吗?

1 个答案:

答案 0 :(得分:1)

这是使用pathlib的递归尝试:

from pathlib import Path
import xml.etree.ElementTree as ET

def xml_dir(pth, et_element=None):

    if et_element is None:
        et_element = ET.Element(pth.name)
    else:
        et_element = ET.SubElement(et_element, pth.name)

    for file in (fle for fle in pth.iterdir() if fle.is_file()):
        ET.SubElement(et_element, file.name)

    for directory in (fle for fle in pth.iterdir() if fle.is_dir()):
        xml_dir(directory, et_element)

    return et_element

ret = xml_dir(Path('/home/user/startdir/'))

这会在开头创建一个新的ET.Element,然后为每个子目录附加ET.SubElement

你可能想要另外对文件和目录进行排序......

如果你需要一个漂亮的xml输出,你需要这个缩进功能(来自http://effbot.org/zone/element-lib.htm#prettyprint

def indent(elem, level=0):
    i = "\n" + level*"  "
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "  "
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            indent(elem, level+1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i

并使用它获得元素树的一个很好的字符串表示:

ret = xml_dir(Path('/home/user/startdir/'))
indent(ret)
ET.dump(ret)

或者,如果要将字符串保存在变量中:

strg = ET.tostring(ret, method='xml').decode()