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
_______________________________________________
XML-SIG maillist  -  XML-SIG@python.org
http://mail.python.org/mailman/listinfo/xml-sig

Reply via email to