元素树,解析XML没有出现在QLineEdit中

时间:2014-04-02 12:23:38

标签: python xpath xml-namespaces elementtree

我在QGIS中创建插件,从本地磁盘或可移动磁盘打开并解析xml,这是我用来打开xml文件的代码:

from PyQt4 import QtCore, QtGui
from ui_testparse import Ui_testparse
import xml.etree.ElementTree as ETree
# create the dialog for zoom to point


class testparseDialog(QtGui.QDialog):
    def __init__(self):
        QtGui.QDialog.__init__(self)
        # Set up the user interface from Designer.
        self.ui = Ui_testparse()
        self.ui.setupUi(self)

        opendata = self.ui.btnCari
        QtCore.QObject.connect(opendata, QtCore.SIGNAL('clicked()'),self.openxml)

    def openxml(self, event=None):

        #open dialog
        openfile = QtGui.QFileDialog.getOpenFileName(self, 'Open File', '*.xml')

        self.ui.lineLokasi.setText(openfile)

        #call XML data
        self.isiData(openfile)

    def isiData(self, nmsatu):
        #open teks with read mode
        openteks = open(nmsatu, 'r').read()

        self.ui.textXml.setText(openteks)

并解析xml之后我尝试使用Element Tree,这个代码我用来解析上面代码中的xml:

#Parse XML from Above
        self.parsenow(openteks)

    def parsenow(self, parse):
        element = ETree.fromstring(parse)
        xml_obj = ETree.ElementTree(element)
        for title_obj in xml_obj.findall('./{gmd#}dateStamp/{gco#}Date'):
            print element
            self.ui.lineSkala.setText(element)

和xml我要解析的格式如下:

<gmd:datestamp>
<gco:Date> XML Date </gco:Date>

我尝试在QT中的LineSkala(lineEdit)中显示 XML Date ,但是当我运行它时,它可以打开并读取xml但无法在lineSkala中显示 XML Date ,它只是空白,并没有给我任何错误信息

我想念的是什么? 感谢您的帮助

1 个答案:

答案 0 :(得分:2)

XPath syntax supported by etree非常有限。此外,您必须在使用find/findall时提供前缀字典(尽管在python2中没有正确记录),或者使用完整的命名空间uri。

所以尝试类似:

ns = {
    'gmd': 'http://www.isotc211.org/2005/gmd',
    'gco': 'http://www.isotc211.org/2005/gco',
    }

tree.findall('.//gmd:dateStamp/gco:Date', ns)

或:

tree.findall('.//{http://www.isotc211.org/2005/gmd}dateStamp/'
             '{http://www.isotc211.org/2005/gco}Date')

PS:

如果您需要使用更复杂的XPath语法,请尝试lxml,它具有与ElementTree非常相似的API,但还有更多功能。