如何获取 QTreeWidget 中 XML 元素的 ID 并向其中插入新元素
How to get the ID of a XML element in a QTreeWidget and insert a new element into it
我在 QTreeWidget
视图中插入了一个 XML 文件,我想获取树中所选目录的 ID 并将新的 XML 元素(目录)插入到它。
XML 文件的基本内容:
例如,我想点击directory 1
并在其中创建一个新的目录或文档。我想获取所选目录的 ID 并通过 ID 在该元素中创建一个新目录。
<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1"></document>
<document name="Document 2" id="document_1_2"></document>
<document name="Document 3" id="document_1_3"></document>
<document name="Document 4" id="document_1_4"></document>
<document name="Document 5" id="document_1_5"></document>
<document name="Document 6" id="document_1_6"></document>
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1"></document>
<document name="Document 2" id="document_2_2"></document>
<document name="Document 3" id="document_2_3"></document>
</dir>
</dir>
节目展示图片:
我成功获取了元素ID,但我不知道如何插入新元素。
self.treeWidget.itemClicked.connect(self.onItemClicked)
def onItemClicked(self):
item = self.treeWidget.currentItem()
print(self.getParentPath(item))
def getParentPath(self, item):
def getParent(item, outstring):
if item.parent() is None:
return outstring
outstring = item.parent().text(0) + "/" + outstring
return getParent(item.parent(), outstring)
output = getParent(item, item.text(0))
return output
比如我想把目录3和目录4加到目录2中,就是这个样子
<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1"></document>
<document name="Document 2" id="document_1_2"></document>
<document name="Document 3" id="document_1_3"></document>
<document name="Document 4" id="document_1_4"></document>
<document name="Document 5" id="document_1_5"></document>
<document name="Document 6" id="document_1_6"></document>
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1"></document>
<document name="Document 2" id="document_2_2"></document>
<document name="Document 3" id="document_2_3"></document>
<dir name="Directory 3" id="directory_3"></dir>
<dir name="Directory 4" id="directory_4"></dir>
</dir>
</dir>
所以我需要列出所有目录和我选择的目录以获取他的 id 并插入一个新目录。
见下文
import xml.etree.ElementTree as ET
xml = '''<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1"></document>
<document name="Document 2" id="document_1_2"></document>
<document name="Document 3" id="document_1_3"></document>
<document name="Document 4" id="document_1_4"></document>
<document name="Document 5" id="document_1_5"></document>
<document name="Document 6" id="document_1_6"></document>
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1"></document>
<document name="Document 2" id="document_2_2"></document>
<document name="Document 3" id="document_2_3"></document>
</dir>
</dir>'''
root = ET.fromstring(xml)
folder = root.find('.//dir[@name="Directory 2"]')
for x in [3,4]:
ET.SubElement(folder, 'dir',{'name':f'Directory {x}','id':f'directory_{x}'})
ET.dump(root)
输出
<?xml version="1.0" encoding="UTF-8"?>
<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1" />
<document name="Document 2" id="document_1_2" />
<document name="Document 3" id="document_1_3" />
<document name="Document 4" id="document_1_4" />
<document name="Document 5" id="document_1_5" />
<document name="Document 6" id="document_1_6" />
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1" />
<document name="Document 2" id="document_2_2" />
<document name="Document 3" id="document_2_3" />
<dir name="Directory 3" id="directory_3" />
<dir name="Directory 4" id="directory_4" />
</dir>
</dir>
我在 QTreeWidget
视图中插入了一个 XML 文件,我想获取树中所选目录的 ID 并将新的 XML 元素(目录)插入到它。
XML 文件的基本内容:
例如,我想点击directory 1
并在其中创建一个新的目录或文档。我想获取所选目录的 ID 并通过 ID 在该元素中创建一个新目录。
<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1"></document>
<document name="Document 2" id="document_1_2"></document>
<document name="Document 3" id="document_1_3"></document>
<document name="Document 4" id="document_1_4"></document>
<document name="Document 5" id="document_1_5"></document>
<document name="Document 6" id="document_1_6"></document>
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1"></document>
<document name="Document 2" id="document_2_2"></document>
<document name="Document 3" id="document_2_3"></document>
</dir>
</dir>
节目展示图片:
我成功获取了元素ID,但我不知道如何插入新元素。
self.treeWidget.itemClicked.connect(self.onItemClicked)
def onItemClicked(self):
item = self.treeWidget.currentItem()
print(self.getParentPath(item))
def getParentPath(self, item):
def getParent(item, outstring):
if item.parent() is None:
return outstring
outstring = item.parent().text(0) + "/" + outstring
return getParent(item.parent(), outstring)
output = getParent(item, item.text(0))
return output
比如我想把目录3和目录4加到目录2中,就是这个样子
<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1"></document>
<document name="Document 2" id="document_1_2"></document>
<document name="Document 3" id="document_1_3"></document>
<document name="Document 4" id="document_1_4"></document>
<document name="Document 5" id="document_1_5"></document>
<document name="Document 6" id="document_1_6"></document>
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1"></document>
<document name="Document 2" id="document_2_2"></document>
<document name="Document 3" id="document_2_3"></document>
<dir name="Directory 3" id="directory_3"></dir>
<dir name="Directory 4" id="directory_4"></dir>
</dir>
</dir>
所以我需要列出所有目录和我选择的目录以获取他的 id 并插入一个新目录。
见下文
import xml.etree.ElementTree as ET
xml = '''<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1"></document>
<document name="Document 2" id="document_1_2"></document>
<document name="Document 3" id="document_1_3"></document>
<document name="Document 4" id="document_1_4"></document>
<document name="Document 5" id="document_1_5"></document>
<document name="Document 6" id="document_1_6"></document>
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1"></document>
<document name="Document 2" id="document_2_2"></document>
<document name="Document 3" id="document_2_3"></document>
</dir>
</dir>'''
root = ET.fromstring(xml)
folder = root.find('.//dir[@name="Directory 2"]')
for x in [3,4]:
ET.SubElement(folder, 'dir',{'name':f'Directory {x}','id':f'directory_{x}'})
ET.dump(root)
输出
<?xml version="1.0" encoding="UTF-8"?>
<dir name="Work space" id="directory_0">
<dir name="Directory 1" id="directory_1">
<document name="Document 1" id="document_1_1" />
<document name="Document 2" id="document_1_2" />
<document name="Document 3" id="document_1_3" />
<document name="Document 4" id="document_1_4" />
<document name="Document 5" id="document_1_5" />
<document name="Document 6" id="document_1_6" />
</dir>
<dir name="Directory 2" id="directory_2">
<document name="Document 1" id="document_2_1" />
<document name="Document 2" id="document_2_2" />
<document name="Document 3" id="document_2_3" />
<dir name="Directory 3" id="directory_3" />
<dir name="Directory 4" id="directory_4" />
</dir>
</dir>