![]() |
![]() | ![]() | ![]() | Altova Mailing List Archives>Archive Index >microsoft.public.xml Archive Home >Recent entries >Thread Prev - Re: New node with XML >Thread Next - Re: New node with XML Re: New node with XMLTo: NULL Date: 3/5/2005 1:13:00 PM "Dave" <dave5398@b...> wrote in message news:%23A0sKAYIFHA.2860@T...... > > "Joe Fawcett" <joefawcett@h...> wrote in message > news:uKnJs6WIFHA.4060@T...... >> "Dave" <dave5398@b...> wrote in message >> news:upawMZEIFHA.2936@T...... >> > >> > "Joe Fawcett" <joefawcett@h...> wrote in message >> > news:OtAPn9CIFHA.2936@T...... >> >> "Dave" <dave5398@b...> wrote in message >> >> news:ubVSrcCIFHA.1528@T...... >> >> > Am I missing something or is there an easy way to do this. Suppose I >> > have >> >> > loaded my XML string into a DOMDocument . I have a node whose XML I >> > want to >> >> > replace with new specified XML. This is the equivalent of >> > MyDOMElement.XML = >> >> > sNewXML but I can't find a built in way to do this since the node.XML >> >> > property is read only - I must have missed something as the only way > I >> > have >> >> > found is really a long way round. Can somebody tell me the easy way >> > please. >> >> > >> >> > Dave >> >> > >> >> > >> >> There's no real quick way. You can use the replaceChild method or just >> > delete >> >> the node and append a new one. >> >> >> >> -- >> >> >> >> Joe (MVP - XML) >> >> >> >> >> > Hi Joe, >> > >> > Thanks. I thought as much. It's really as bad as I suspected. The > next >> > version should really make the XML property writeable as well. In fact, > a >> > lot of the XML stuff is so (typically MS) over-engineered that I've had > to >> > code a load of stuff in C++ to actually DO anything - eg, given an XML >> > string, how do you get a given tag's attribute? Big job, whereas if you >> > just search for it direct, it's actually simple. >> > >> > For this job, if I've got a new XML string I want to put into a node I > have >> > to create a new DOMDocument, load the XML then do a load of recursive > calls >> > to traverse the whole structure creating corresponding nodes in my > original >> > DOMDocument. What a pain!!! So much simpler to put Node.XML=newXML - > no? >> > Or can you think of anything neater? >> > >> > Dave >> > >> > Regards, >> > >> > Davd >> > >> Although I often criticise Microsoft you can't really balme them for this > one, >> it's a fairly standardised interface. >> Sounds like an XSLT transform would do the job, downside is it's another > API to >> learn. >> Another combination that would suit would be the XmlReader/XmlWriter > classses in >> the .net framework or the SAX methods. >> If you post some example of your type of problem I'll try to come up with > basic >> XSLT that you can build on. >> >> -- >> >> Joe (MVP - XML) > > Hi Joe, > > Thanks. I DO blame Microsoft because their philosophy is "if it's easy, > complicate it!" I don't know what XSLT is and I suspect I don't want to - > probably another Microsoft lash up job! (cf object persistence a la > Microsoft - big nightmare, I have rolled my own - a couple of simple > routines and done!, same for encryption while we're on the subject ) > > Anyway I solved this in a completely unexpected way (illogical but the two > illogicalities seem to cancel each other!!). My problem is given a > DOMElement node, replace it with one using new, specified XML. In fact, if > you load the XML into a NEW DOMDocument, you can replace the node in > DOMDocumentA, directly with the one in DOMDocumentB. I had assumed elements > of the first document could not communicate with elements in another one in > this way, but it works! Here is what I do. To replace a node which SHOULD > be: aNode.XML=newXML, I use: > > Private Function ReplaceNode(aNode As IXMLDOMElement, newXML As String) As > Boolean > Dim pDoc As New DOMDocument30 > ReplaceNode = False > If Not pDoc.loadXML(newXML) Then Exit Function > aNode.parentNode.replaceChild pDoc.documentElement, aNode > ReplaceNode = True > End Function > > This seems too easy and you'll tell me there's going to be a problem with > it, but so far it looks OK. > > Dave > I don't want to argue about Microsoft, we all know they are not perfect by a long way. In their defence anyone can write a few routines that suit them and what they need, to write platforms is considerably more difficult. XSLT is another standard, nothing to do with Microsoft and the msxml class has one of the best implementations of it. As for your code there is one potential problem that might surface later or not, I've only seen it happen in certain circumstances so it depends on what you are doing latrer with the dom. You are right, nodes are not supposed to be transported between documents, you need to use the cloneNode method to disassociate the node from its parent: Private Function ReplaceNode(aNode As IXMLDOMElement, newXML As String) As Boolean Dim pDoc As New DOMDocument30 ReplaceNode = False If Not pDoc.loadXML(newXML) Then Exit Function aNode.parentNode.replaceChild pDoc.documentElement.cloneNode(True) , aNode ReplaceNode = True End Function -- Joe (MVP - XML) | ![]() | ![]() | ![]() |
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | |||||
|
