Hi Rush, The template is not so simple as shown. It's just a snippet of the actual template xml.
So, is there anything to do with DTD here, Doc. Type Definition?? Any thoughts on this?? Thanks Senthil Nathan R On 8/17/07, Rush Manbert <[EMAIL PROTECTED]> wrote: > > Senthil Nathan wrote: > > Hi Rush, > > Gr8. Thanks for the info. > > > > And reg. the 4th point, I need to insert the values in the proper places > of > > the DOM tree. > > You got it rightly. So how do I get that done?? > > > > Senthil > > > > On 8/17/07, Rush Manbert <[EMAIL PROTECTED]> wrote: > > > >>Senthil Nathan wrote: > >> > >>> Hi, > >>>I'm new to use libxml2. I need general clarifications of using libxml2 > >> > >>for > >> > >>>my application. > >>> > >>>Say, I have a XML content as, > >>> > >>><hostName> > >>> <defaultValue>value</defaultValue> > >>> <description> > >>> <shortDescr>Hostname descr.</shortDescr> > >>> <longDescr>long descr of Hostname</longDescr> > >>> </description> > >>> > >>> <dataType>string</dataType> > >>> <operations>set,delete</operations> > >>> > >>></hostName> > >>> > > <snip> > > >>>4. I have a template XML file and a config XML file. All the values for > >> > >>the > >> > >>>template should be available in the config file. Is that possible with > >>>libxml2? > >>> > >> > >>So you would have a template file that looks like this: > >><hostName> > >> <defaultValue></defaultValue> > >> <description> > >> <shortDescr></shortDescr> > >> <longDescr></longDescr> > >> </description> > >> > >> <dataType></dataType> > >> <operations></operations> > >> > >></hostName> > >> > >>and, according to your example, you want to insert these values: > >>value > >>Hostname descr. > >>long descr of Hostname > >>string > >>set,delete > >> > >>into the proper places in the DOM structure. > >>Or maybe just into the proper places in a text file. > >>Or maybe as attributes on some element. > >> > >>Do I understand this correctly? > >> > >>- Rush > >> > > > > Here are some options: > > 1) If your template is really as simple as you have shown, it's probably > easiest to just keep it as text in a std::string. Something like this: > > std::string myTemplate ( > "<hostName>" > " <defaultValue>%1</defaultValue>" > " <description>" > " <shortDescr>%2</shortDescr>" > " <longDescr>%3</longDescr>" > " </description>" > " <dataType>%4</dataType>" > " <operations>%5</operations>" > "</hostName>"); > > Then, when you have assembled all of your values that you want in the > config file, you just copy myTemplate, then use the std::string > functions to find and replace %1 through %5. (You can wrap all this in > an object to hide the nasty details.) Once you have the result, just > parse it with xmlParseMemory() or xmlReadMemory() (or others?) to get > the DOM tree. Of course, if your goal is to write the config file > formatted as XML, then you already have the content in your string and > you don't need libxml. > > 2) Parse your template file to get a xmlDocPtr for it. When you need to > generate the config file, copy the template using xmlCopyDoc(). Now you > have a copy of the DOM tree for the template file and you need to insert > the element data. I can see two ways to do this: > > a) Apply a XSL transformation to the tree. The downside to this is that > you need to generate the style sheet on the fly, so that it contains the > values that you need to insert. Again, if your template is as simple as > your example, then the style sheet is also very simple, so is easy to > generate. If your template file is more complicated, then the style > sheet could get complicated as well. > > b) Using one of the xmlDocDump*() functions as an example, write > yourself a node walker and have it call back for every node. Use the > node (element) name to decide what to do, and insert your data into the > node structure. This only works if your template file is as simple as > you show, and each unique element name only shows up once. If your > template really looks like this: > <hostList> > <hostName> > <defaultValue></defaultValue> > <description> > <shortDescr></shortDescr> > <longDescr></longDescr> > </description> > <dataType></dataType> > <operations></operations> > </hostName> > <hostName> > <defaultValue></defaultValue> > <description> > <shortDescr></shortDescr> > <longDescr></longDescr> > </description> > <dataType></dataType> > <operations></operations> > </hostName> > </hostList> > > then it gets harder, but I guess you could group your values you want to > insert and count instances of each element, or instances of "hostName" > to know which values you need to insert. If your template is really > structured more like this, then this approach might be easier than using > a XSL style sheet, because it's easier to understand how to write the > logic in C or C++ than in XSL. It could be a maintenance nightmare too, > if your template file format changes. > > I should also mention here that I believe this is the idea behind a SAX > interface, so you might be able to use that instead of manipulating the > DOM. (I have never used SAX, so don't know any details. I have written a > node walker and done in-place modifications to the DOM tree.) > > 3) Like 2, but don't bother to pre-parse your template because libxml > has a really fast parser. Just parse the template file, then process the > tree each time you need to write your config file. > > There may well be other approaches. These are all I can think of right > now. Best of luck. > > Regards, > Rush > -- http://www.jaxtr.com/rsennat - You can call me for free by clicking on this link.
_______________________________________________ xml mailing list, project page http://xmlsoft.org/ [email protected] http://mail.gnome.org/mailman/listinfo/xml
