Alternatively, just use the XPath implementation of my Internet Tools (http://www.benibela.de/sources_en.html#internettools).

Works perfectly there.

E.g. process('<root> <u1:e1 xmlns:u1="URI-1" u1:AnAttribute="AttValue"/> <u2:e2 xmlns:u2="URI-2"/> </root>', '//@u1:AnAttribute' ).toString
returns 'AttValue'


On 10/05/2013 07:08 PM, Daniel Gaspary wrote:
(Let me know if bugtracker is better to discuss the idea)

Today the XPath Ns Resolver is marked as "Experimental" and is just an
alias for TDomNode:

   TXPathNSResolver = TDOMNode {!!! experimental}; [1]

The problem happens when the Namespace definition is not at the root
of the XML being processed:

<root>
   <u1:e1 xmlns:u1="URI-1" u1:AnAttribute="AttValue"/>
   <u2:e2 xmlns:u2="URI-2"/>
</root>

Using....

     EvaluateXPathExpression('//@u1:AnAttribute', x.DocumentElement,
    x.DocumentElement);

(x is a TXmlDocument)

  Will raise an Exception due to the "Resolver" not being capable of
finding the URI when starting from root.

I think of something simple as:

TXPathNSResolver = class

    property CurrentNode: TDomNode; //Necessary??
    property xml: TXmlDocument;
    property OnNeedUri: TXPathNeedUriEvent;
end;

TXPathNeedUriEvent would be something like:

procedure (Sender: TXPathNSResolver; out AUri: String) of object;

Searching first at CurrentNode.lookupNamespaceURI and, if not found,
using OnNeedUri.

Ideas?

Should I post it at mantis, change, quit.. ?


[1] Line #352: 
http://svn.freepascal.org/cgi-bin/viewvc.cgi/trunk/packages/fcl-xml/src/xpath.pp?view=markup
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to