Alex Neblett wrote:
Hello again:) I must have caught a nerve or two judging by the response...not really sure why... Maybe I should try rewording the question... I would like to be able to read the innerxml as a string result of an Xpath query. So, for example, if I have some xml such as: ... <topnode> <anode> <bnode>sjdlkdsf</bnode> <cnode>lkjlkdsf</cnode> </anode> <tnode> <unode>sjsddlkdsf</unode> <vnode>lkjlkfddsf</vnode> </tnode> </topnode> ... and queried //anode the resulting string would be... <bnode>sjdlkdsf</bnode> <cnode>lkjlkdsf</cnode> I wrote a C# wrapper which calls libxml2 to do this, but I am not entirely happy with my approach as was looking for guidance as to a better way to do it...
I had a similar problem. But i dont know if my approach is better :) I used a xmlwriter with a buffer for creating the output. So im looping over the nodes i get and use the writer to create a new doc. In the end i just return the content of the buffer.
My example function is below: [STAThread] public static unsafe string singlenodeinnerxml(bool SourceIsString,string sourcexml, string XPathExpression, System.Text.Encoding xmlencoding) { xmlInitParser(); _xmlDoc *doc; if (SourceIsString == true) { doc = xmlParseMemory(new System.Text.StringBuilder(sourcexml),sourcexml.Length); } else { doc = xmlParseFile(sourcexml); } if (doc == null) { return ""; } _xmlXPathContext *xpathCtx = xmlXPathNewContext(doc); if(xpathCtx == null) { xmlFreeDoc(doc); return ""; } _xmlXPathObject *xpathObj = xmlXPathEval(XPathExpression ,xpathCtx); if(xpathObj == null || xpathObj->nodesetval == null) { xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); return ""; } Console.WriteLine("\n[" + xpathObj->type1.ToString() + "]\n"); _xmlBuffer *mybuffer = xmlBufferCreate(); Console.WriteLine("\n[" + xmlNodeDump(mybuffer, doc, xpathObj->nodesetval->nodeTab[0], 0, 0).ToString() + "] bytes written\n"); byte *mybyte = xmlBufferContent(mybuffer); int xpathlen = xmlStrlen(mybyte); byte[] bytesArray = new byte[xpathlen]; for (int i = 0; i < xpathlen; i ++) { bytesArray[i] = *(mybyte + i); } xmlBufferFree(mybuffer); xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); string mystring = xmlencoding.GetString(bytesArray); // mystring contains .outerXml // the below string manipulations convert .outerXml into .innerXml, but the design is poor... mystring = mystring.Substring(0,mystring.LastIndexOf("<")); // remove closing outerelement mystring = mystring.Substring(mystring.IndexOf(">") + 1); // remove starting outerelement System.GC.Collect(); System.Windows.Forms.Application.DoEvents(); return mystring; } Best Regards, Alex -----Original Message----- From: Daniel Veillard [mailto:veillard redhat com] Sent: Wednesday, July 13, 2005 7:25 AM To: Alex Neblett Cc: xml gnome org Subject: Re: [xml] Best Process for InnerXML from Xpath Query On Wed, Jul 13, 2005 at 07:21:25AM -0500, Alex Neblett wrote:Hello, What is the best process to get the innerxml from an Xpath query using the latest libxml2?Do NOT use Reply on an existing mail thread to ask a completely unrelated question :-( And I don't understand your question ... at all ! Daniel
Attachment:
signature.asc
Description: OpenPGP digital signature