[XML-SIG] Using XML Namespaces in XPath Expressions from Python
JonTom Kittredge
jontom at itasoftware.com
Wed Jun 8 16:27:26 CEST 2005
I'm having trouble using PyXML to evaluate XPath expressions that
include namespace references.
Here is a sample Python snipped:
#!/usr/bin/env pystart
import sys
import xml.dom.minidom
from xml.xpath.Context import Context
from xml.xpath import Evaluate
from xml.xpath.NamespaceNode import NamespaceNode
if __name__ == "__main__":
sys.stderr.write("XPathTest: 18\n")
inputDom = xml.dom.minidom.parse(open("xpathtest-input.xml"))
sys.stderr.write("Node: %s\n" % (inputDom.documentElement))
outContext = Context(inputDom.documentElement)
sys.stderr.write("NSes=%s\n" % (outContext.nss()))
result = Evaluate("count(/dbq:Contract)",
contextNode=inputDom.documentElement,
context=outContext)
sys.stderr.write("Eval xpath \"count(/dbq:Contract)\": %d\n" % result)
Here is what xpathtest-input.xml looks like:
<?xml version="1.0"?>
<dbq:Contract
xmlns:dbq="http://dtd.itasoftware.com/Dubuque">
<dbq:RuleContent/>
</dbq:Contract>
Here is the output I get
[xsl] zyp| xpathtest.py
XPathTest: 18
Node: <DOM Element: dbq:Contract at 0x82a5a6c>
NSes={'xml': 'http://www.w3.org/XML/1998/namespace', u'dbq': u'http://dtd.itasoftware.com/Dubuque'}
Traceback (most recent call last):
File "xpathtest.py", line 22, in ?
context=outContext)
File "/ita/python-2.2.2/lib/python2.2/site-packages/_xmlplus/xpath/__init__.py", line 70, in Evaluate
retval = parser.new().parse(expr).evaluate(con)
File "/ita/python-2.2.2/lib/python2.2/site-packages/_xmlplus/xpath/ParsedExpr.py", line 179, in evaluate
arg0 = self._arg0.evaluate(context)
File "/ita/python-2.2.2/lib/python2.2/site-packages/_xmlplus/xpath/ParsedAbsoluteLocationPath.py", line 26, in evaluate
rt = self._child.select(context)
File "/ita/python-2.2.2/lib/python2.2/site-packages/_xmlplus/xpath/ParsedStep.py", line 32, in evaluate
(node_set, reverse) = self._axis.select(context, self._nodeTest.match)
File "/ita/python-2.2.2/lib/python2.2/site-packages/_xmlplus/xpath/ParsedAxisSpecifier.py", line 114, in select
list(context.node.childNodes))
File "/ita/python-2.2.2/lib/python2.2/site-packages/_xmlplus/xpath/ParsedAxisSpecifier.py", line 112, in <lambda>
rt = filter(lambda node, test=nodeTest, context=context, pt=self.principalType:
File "/ita/python-2.2.2/lib/python2.2/site-packages/_xmlplus/xpath/ParsedNodeTest.py", line 168, in match
self._prefix)
xml.xpath.RuntimeException: Undefined namespace prefix: "dbq".
exit status: 1
I can see from the output that the Context object I am passing to
Evaluate() includes the DBQ namespace. But apparently that is not
enough.
Can anyone tell me what I am doing wrong?
Yours, JonTom
JT Kittredge
ITA Software, Inc.
Cambridge, Massachusetts
More information about the XML-SIG
mailing list