Hi,

On Mon, 2005-06-20 at 00:44 +0200, Jonas Holmberg wrote:
> Hi.
> 
> I have a question about the XPath implementation.
> I have tried to get the default attributes from the DTD:s to work with the 
> XPath lookups.
> I am very new to libxml, so if there is a very well known answer, I'm 
> sorry...
> 
> Consider the following document:
> 
> <?xml version="1.0"?>
> <!DOCTYPE root SYSTEM "root.dtd" [
> <!ELEMENT elem (#PCDATA)>
> <!ATTLIST elem test CDATA "nothing">
> <!ELEMENT root (elem)>
> ]>
> <root>
>  <elem>data1</elem>
>  <elem>data2</elem>
>  <elem test="something">data3</elem>
> </root>
> 
> with this code:
> 
> void doXPath(xmlDocPtr doc,xmlChar* xpathExpr)
> {
>    xmlXPathContextPtr xpathCtx = xmlXPathNewContext(doc);
>    xmlXPathObjectPtr xpathObj = xmlXPathEvalExpression(xpathExpr,xpathCtx);
>    xmlNodeSetPtr nodes = xpathObj->nodesetval;
>    for (int i = 0; i < nodes->nodeNr; i++) {
>       if (nodes->nodeTab[i]->type == XML_ELEMENT_NODE) {
>          xmlNodePtr node = nodes->nodeTab[i];
>          xmlChar* pProp = xmlGetProp(node,BAD_CAST "test");
>          xmlChar* pContent = xmlNodeGetContent(node);
>          std::cout << "Node: " << node->name << ", Data: " << pContent << ", 
> test = " << pProp << endl;
>          xmlFree((void*) pContent);
>          xmlFree((void*) pProp);
>       }
>    }
>    xmlXPathFreeObject(xpathObjPtr);
>    xmlXPathFreeContext(xpathContextPtr);
> }
> 
> doXPath(doc,(xmlChar*) "//root/*");
> gives me:
> Node: elem, Data: data1, test = nothing
> Node: elem, Data: data2, test = nothing
> Node: elem, Data: data3, test = something
> 
> So, xmlGetProp works great, giving me the default value of "nothing"
> 
> doXPath(doc,(xmlChar*) "//root/[EMAIL PROTECTED]"something\"");
> gives me:
> Node: elem, Data: data3, test = something
> 
> Still, as expected.
> 
> But.
> doXPath(doc,(xmlChar*) "//root/[EMAIL PROTECTED]"nothing\"");
> gives me no results...
> 
> 
> Am I wrong in expecting xpath to work with default values, or can anybody 
> help me out?

Functions like xmlReadFile [1] take an @options [2] argument. The
XML_PARSE_DTDATTR option-flag will create default attributes
of the DTD in the resulting node tree, thereafter they will be
visible to XPath.

[1] http://xmlsoft.org/html/libxml-parser.html#xmlReadFile
[2] http://xmlsoft.org/html/libxml-parser.html#xmlParserOption

Regards,

Kasimier
_______________________________________________
xml mailing list, project page  http://xmlsoft.org/
[email protected]
http://mail.gnome.org/mailman/listinfo/xml

Reply via email to