因此,它不是XML问题,而是PySide / Menu项目。我有一个简单的XML查看器/编辑器用于简单的xml文件,我想保存生成的xml文件。我在此处添加了一个代码段,其功能已删除,以简洁起见。我在这里的重点只是菜单' save'因为这是我似乎最不习惯的事情。
我已经评论了难以保存的'链接。硬链接适用于写入文件。如果我绕过QFile对话框中的QtCore.QFile(filePath)返回并用硬链接替换文件路径,则xlm树将按预期导出。
当我使用对话框菜单时(这是问题),os文件被打开但没有写入任何内容,文件大小保持为' 0'尺寸。这可能是文件锁定问题吗?无法理解为什么这两者不应该同时工作和打开'事物的一面(为了简洁而注释)在构建和查看我的xml树时工作得很好。
任何人都可以帮助我吗?它一定是显而易见的,但也许我已经盯着它看太久了,问题就在眼前!#/ p>
谢谢,
#!/usr/bin/env python
# using python3
from PySide import QtCore, QtGui
from xml.etree.ElementTree import parse, Element
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.fileMenu = self.menuBar().addMenu("&File")
self.fileMenu.addAction("&Open...", self.openFile, "Ctrl+O")
self.fileMenu.addAction("&Save...", self.saveFile, "Ctrl+S")
self.fileMenu.addAction("E&xit", self.close, "Ctrl+Q")
#self.xmlPath = ""
self.view = QtGui.QTreeView(self)
# snippet - edit/view code removed here for brevity
self.setCentralWidget(self.view)
self.setWindowTitle("XML Editor")
self.xmlPath = ""
self.fileIn = ""
self.fileOut = ""
def openFile(self):
filePath,_ = QtGui.QFileDialog.getOpenFileName(self, "Open File",
self.xmlPath, "XML files (*.xml);;HTML files (*.html);;"
"SVG files (*.svg);;User Interface files (*.ui)")
if filePath:
self.f = QtCore.QFile(filePath)
print("Open filePath")
print(self.f.fileName())
self.fileIn = self.f.fileName()
#doc = parse(self.fileIn)
#root = doc.getroot()
print("fileIn")
print(self.fileIn)
self.f.close()
def saveFile(self):
fileName = QtGui.QFileDialog.getSaveFileName(self,
"Save Project File", QtCore.QDir.currentPath(),
"XML Files (*.xml)")[0]
if not fileName:
return
self.outFile = QtCore.QFile(fileName)
print("Save outFile")
self.fileOut = self.outFile.fileName()
print(self.fileOut)
doc = parse("catalog.xml")
root = doc.getroot()
# setting filename via dialog - uncomment for (working) hardcoded name variable
doc.write(self.fileOut, xml_declaration=True)
# but hardcoded name works fine function
#doc.write("catalog_saved.xml", xml_declaration=True)
if not self.outFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
QtGui.QMessageBox.warning(self, "XML Editor",
"Cannot write file %s:\n%s." % (fileName, outFile.errorString()))
return
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = MainWindow()
window.resize(640, 480)
window.show()
sys.exit(app.exec_())
这是测试xml文件catalog.xml:
<?xml version='1.0' encoding='us-ascii'?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
<CD>
<TITLE>Greatest Hits</TITLE>
<ARTIST>Dolly Parton</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>RCA</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1982</YEAR>
</CD>
<CD>
<TITLE>Still got the blues</TITLE>
<ARTIST>Gary Moore</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>Virgin records</COMPANY>
<PRICE>10.20</PRICE>
<YEAR>1990</YEAR>
</CD>
</CATALOG>
** 更新:实际上我现在通过使用此功能代替上述保存功能解决了这个问题:
def browseClicked(self):
name = QtGui.QFileDialog.getSaveFileName(self, 'Save File')
self.browseEdit.setText(name[0])
doc = parse("catalog.xml")
root = doc.getroot()
doc.write(name[0], xml_declaration=True)
它基本上是相同的功能但是分开了,这次我在初始化时将文件名声明为QLineEdit字段而不是字符串。所以也许我有一个字符串对象或初始化问题,虽然原来是返回一个字符串路径,并使用硬编码的文件名路径。仍然试图弄清楚为什么我原来的那个没有用。我讨厌不了解事情。