- From: Piotr Sipika <piotreks@optonline.net>
- Date: Fri, 09 Dec 2011 09:43:33 -0500
- To: Andy Davidson <andy_davidson@apple.com>
- Cc: Liam R E Quin <liam@holoweb.net>, xmlschema-dev@w3.org
On 12/08/2011 09:58 PM, Liam R E Quin wrote:
> Since libxml is stuck on XPath 1, you can use explicit xsi:type
> attributes but not type annotations that result from schema validation
> episodes - you'd need an XPath 2 engine for that, such as Saxon.
>
>> I eventual get a a xmlNodePtr that points to
>>
>> <animal xsi:type="zoo:Fish">
>> <name>tuna</name>
>> <numberOfFins>4</numberOfFins>
>> </animal>
>>
>> I can not seem to select the attribute. "@*" works but is not going to work long term.
>>
>> "@xsi:type" and "@type" did not work
>
> You need to bind the prefix xsi to the right URI in the namespace
> context before evaluating the expression. Google for xpath and
> namespaces. Then you can use @xsi:type.
As Liam wrote, you'll need to register all the namespaces you intend to
use in your XPath searches with the XPath context. The code would look
something like:
xmlXPathContextPtr pContext = xmlXPathNewContext(pDoc);
....
if (xmlXPathRegisterNs(pContext,
(xmlChar*)"xsi",
(xmlChar*)"http://www.w3.org/2001/XMLSchema-instance") != 0)
{
fprintf(stderr, "Failed to register xsi\n");
}
if (xmlXPathRegisterNs(pContext,
(xmlChar*)"zoo",
(xmlChar*)"http://www.example.org/Zoo") != 0)
{
fprintf(stderr, "Failed to register zoo\n");
}
xmlXPathObjectPtr pObj = xmlXPathEvalExpression(pzXPath, pContext);
//etc...
The pertinent libxml2 example can be found here:
http://www.xmlsoft.org/examples/xpath1.c
Hope this helps.
P
Received on Monday, 12 December 2011 12:32:04 UTC