我的目录结构如下所示。这里data class Notebook(var notes: List<String>) {
init {
notes = notes.toList()
}
}
是根目录,其中包含目录test
和a
。 b
和a
还分别包含子目录b
,a1
和a2
,b1
。此外,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。 这有可能吗?
答案 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()