Please help extract attributes from root node.

  • Thread starter RichardHatcher.com
  • Start date
R

RichardHatcher.com

I am writing C code using xpath to extract some data from a XML
document. The file uses namespaces, but the name spaces are all listed
in the root node of the file as attributes. I want to extract all the
attributes, so that I can register the namespaces. The document looks
like:

<?xml version="1.0" encoding="UTF-8" ?>
<ConfigDataFile xmlns:SRI="SRI" xmlns:SIW="SIW" xmlns:QBQ="QBQ"
xmlns:VLD="VLD" xmlns:xsi="http://www.mstsc.com/schema"
xsi:schemaLocation="birdflu.xsd">
<SIW:SIW>
<SIW:herewelive apt="yes" pets="none">
<SIW:color>RED</SIW:color>
</SIW:herewelive>
</SIW:SIW>
<QDB:QDB>
<QDB:herewelive apt="NO" crackhouse="no">
<QDB:color>Blue</SIW:color>
</QDB:herewelive>
</QDB:QDB>
</ConfigDataFile>

My code is:

xmlDocPtr doc = NULL;
xmlNodePtr node_ptr = NULL;
xmlAttrPtr attr_ptr = NULL;
xmlXPathContextPtr xpathCtx = NULL;
xmlXPathObjectPtr xpathObj = NULL;

xmlInitParser();

doc = xmlParseFile("test.xml");
xpathCtx = xmlXPathNewContext(doc);
xpathObj = xmlXPathEvalExpression("//ConfigDataFile", xpathCtx);
node_ptr = xpathObj->nodesetval->nodeTab[0];

attr_ptr = node_ptr->properties;
while (attr_ptr != NULL)
{
printf("The Node name is %s\n", node_ptr->name);
printf("Attribute name: %s\n",attr_ptr->name);
printf("Attribute value: %s\n",xmlGetProp(node_ptr,
attr_ptr->name));

attr_ptr = attr_ptr->next;

}
return 1;
}

The problem is that when I run this, the output is only:

The Node name is ConfigDataFile
Attribute name: schemaLocation
Attribute value: birdflu.xsd

All the other attributes are not there. I have used my debugger to
look at the entire node, and the other attributes are just not there.
If I change the eval expression to any other node, I can print all the
attributes of that node. The only node that refuses to act how I
desire is the ConfigDataFile node.

Thank you.
 
J

Joe Kesselman

In XPath, namespace nodes are namespace nodes, *not* attribute nodes. If
you want to see them, you need to use the namespace:: axis... which
includes all inherited namespaces as well as those on this specific node.

(XPath 2.0 is changing how it handles namespace information -- long
story -- but the attributes axis will still not include namespace
declarations.)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,185
Members
46,736
Latest member
AdolphBig6

Latest Threads

Top