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