![]() |
![]() | ![]() | ![]() | Altova Mailing List Archives>Archive Index >comp.text.xml Archive Home >Recent entries >Thread Prev - Re: more XPath struggles (tDOM) [Thread Next] Re: more XPath struggles (tDOM)To: NULL Date: 5/6/2008 10:38:00 AM Mikhail Teterin wrote: >Joseph J. Kesselman wrote: >> XPath is namespace-aware. To select a namespaced node, you must use a >> prefix in your path (which you did) and tell your XPath evaluator what >> the prefix bound to (which you didn't). Look at the user's manual for >> your tool. > >Thanks. After I explicitly set: > > $xml selectNodesNamespaces {mp MarketParameters xc XmlCache} That's the right way to bind prefixes to a namespace. One way. You can always use the -namespaces option to the selectNodes method, but setting things up with one selectNodesNamespaces call for the rest of the lifetime of the document seems to be more convenient to me. >I got some progress... But the namespaces are defined in the document itself >-- for example: > > <xc:XmlCache xmlns:xc="XmlCache" xc:action="Update"> > >why do I still need to specify them? It certainly works with xml_grep... Is >there a bug in the package (tDOM), or is the above element not sufficient >to define a namespace? No, it's not a bug. As long as no selectNodesNamespaces setting nor the -namespaces option is given, tDOM even respects the XML namespace declarations of the document. The context node of your XPath expression is the node, from which you call your XPath expression. If the (all) prefixes, you're using in your XPath expression are in scope of that node, you've to do nothing; namespace resolving will work as you expect. Since you had trouble with this, I'd bet, not all used XML namespace declarations are in scope of your context node. But, as others already have pointed out, it is _dangerous_ to bank on the prefixes in the document. Prefixes don't matter, it's the namespaces, that matters. From the XML viewpoint, <a:doc xmlns:a="http://foo.bar.com"> <a:elem>data</a:elem> </a:doc> and <b:doc xmlns:b="http://foo.bar.com"> <b:elem>data</a:elem> </b:doc> are the in some sense the 'same' documents. You can't just say [$someNode selectNodes a:elem] in your code and expect that to work reliable. If the document provider uses another prefix (bound to the same namespace), your code will fail. The clear way out is, to say the XPath engine, which namespace you mean with which prefix. With e.g. selectNodesNamespaces. rolf | ![]() | ![]() | ![]() |
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | |||
|
