预备噩梦

时间:2015-04-29 03:33:45

标签: python xml elementtree filemaker

我编写了一些代码来连接FileMaker Server并要求在后端服务器上创建新记录。此部分工作正常,结果包含未在浏览器中显示的意外文本。我无法通过在浏览器中查看树来使查找操作工作,因此我最终打印了标记和属性,并且每个标记属性对都具有以下格式:

标记:{http://www.filemaker.com/xml/fmresultset}错误属性:{'code':'0'}

在下面的代码中,我必须将完全限定的标记放入代码中以使第一个查找起作用。这使我很难找到我想从XML获取的对象的xPath。下面的第二个发现不起作用,因为我无法弄清楚路径。路径应为/ resultset / record /,属性为record-id。任何人都知道发生了什么。为什么fmresultset文档会被添加到每个标记之前?

url = self.getBaseURL( machineID, file, lay ) + fields + "&-new"
result = self.sendURL( url )

import xml.etree.ElementTree as ET
root = ET.fromstring(result)
self.printXML( root )

base = "{http://www.filemaker.com/xml/fmresultset}"
find = root.find( base + "error" )
error = find.attrib[ 'code' ]

recID = 0
if ( error == '0' ):
    find = root.find( base + "resultset" + base + "/record" )
    recID = find.attrib[ 'record-id' ]

基思

1 个答案:

答案 0 :(得分:0)

好的......你提到了命名空间这个词,我想出来了。这使用了root的元素版本。

def getXMLValue( self, root, path, value ):
    ns = {'fmrs': 'http://www.filemaker.com/xml/fmresultset' }
    find = root.find( path, ns )
    value = find.attrib[ value ]
    return value

def getError ( self, root ):
    return self.getXMLValue ( root, "fmrs:error", 'code' )

def getRecID ( self, root ):
    return self.getXMLValue ( root, "fmrs:resultset/fmrs:record", 'record-id' )

此代码正确返回正确的值。我期待着类似的东西。创建该类的实例,然后调用setNamespace()。我不得不把所有这些引用都放在fmrs上,我宁愿不这样做,但这解决了问题,而且代码读起来并不可怕。

感谢您的帮助。

-keith