Daniel Veillard wrote:
> 
> On Thu, Jul 17, 2008 at 03:25:20AM -0700, Andrew Hartley wrote:
>> 
>> 
>> Andrew Hartley wrote:
>> > 
>> > Having extracted a sub-document with an XPath expression and now have
>> an
>> > xmlXPathObjectPtr is there a simple way to output the sub-document into
>> a
>> > new xmlDocPtr so that this sub-document can then be saved to disk?
>> > 
>> 
>> 
>> It's ok, I have worked it out:
>> 
>> [code]
>> xmlDocPtr pXmlSubDoc = pXPathObj->nodesetval->nodeTab[0]->doc;
>> [/code]
> 
>   Note that an XPath object could also be a number, a boolean or a string,
> so don't blindly do that dereference and check pXPathObj type first, and
> then that the pointer is not null, and then that the node set at least has
> one node, and that this node is not a namespace (namespace nodes don't
> have
> pointer back to the document).
> 
>   Basically there is tons of checking missing there, and i would prefer
> if other people didn't just cut and past that everywhere...
> I think it really makes more sense to keep the document pointer around, 
> for example it's embedded in the XPath evaluation context. Beware of bad
> scoping/API design that happen frequently when you don't have yet a good
> vison of the objects manipulated.
> 
> Daniel
> 
> -- 
> Red Hat Virtualization group http://redhat.com/virtualization/
> Daniel Veillard      | virtualization library  http://libvirt.org/
> [EMAIL PROTECTED]  | libxml GNOME XML XSLT toolkit  http://xmlsoft.org/
> http://veillard.com/ | Rpmfind RPM search engine  http://rpmfind.net/
> _______________________________________________
> xml mailing list, project page  http://xmlsoft.org/
> [email protected]
> http://mail.gnome.org/mailman/listinfo/xml
> 
> 

Thanks for the reply Daniel.  However, I only wanted to explain that I had
solved the problem.  Here is a little more of my code just in case others
have the same problem:

[code]
xmlDocPtr pXmlDoc = xmlParseFile( szFilepath );

if ( pXmlDoc )
{
   xmlXPathContextPtr pXPathCtx = xmlXPathNewContext( pXmlDoc );

   CString sNsUri = rDoc.GetNameSpaceURI();
   // Register namespace we are just abut to use:
   xmlXPathRegisterNs( pXPathCtx, (const xmlChar*)"ct1", (const
xmlChar*)(LPCTSTR)sNsUri );
   // XPath expression to get the CT1 nodeset:
   xmlXPathObjectPtr pXPathObj = xmlXPathEvalExpression( (const
xmlChar*)"//ct1:Ct1", pXPathCtx );

   if ( pXPathObj )
   {
      xmlNodeSetPtr pNodeSet = pXPathObj->nodesetval;

      if ( pNodeSet && pNodeSet->nodeNr > 0 
                         && pNodeSet->nodeTab[0]->type != XML_NAMESPACE_DECL 
                         && pNodeSet->nodeTab[0] )
      {
         // sub-document containing only the CT1 nodeset:
         xmlDocPtr pXmlSubDoc = pNodeSet->nodeTab[0]->doc;

         // ... and save:
         xmlSaveCtxtPtr pSaveCtx = xmlSaveToFilename(
sFilenameCopyTo.c_str(), NULL, 0 );
         long ret = xmlSaveDoc( pSaveCtx, pXmlSubDoc );
         ret = xmlSaveClose( pSaveCtx );

         ++nCopied;

         xmlXPathFreeObject( pXPathObj );
      }
   }

   xmlXPathFreeContext( pXPathCtx );
   xmlFreeDoc( pXmlDoc );
}
[/code]
-- 
View this message in context: 
http://www.nabble.com/Get-sub-document-from-xmlDocPtr-tp18504765p18507651.html
Sent from the Gnome - Lib - Xml - General mailing list archive at Nabble.com.

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

Reply via email to