Home. 
.

transparent

transparent

transparent

Altova Mailing List Archives


Re: New node with XML

From: "Joe Fawcett" <joefawcett@-------.--->
To: 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)







transparent
Print
Mail
Digg
delicious
Disclaimer
.

These Archives are provided for informational purposes only and have been generated directly from the Altova mailing list archive system and are comprised of the lists set forth on www.altova.com/list/index.html. Therefore, Altova does not warrant or guarantee the accuracy, reliability, completeness, usefulness, non-infringement of intellectual property rights, or quality of any content on the Altova Mailing List Archive(s), regardless of who originates that content. You expressly understand and agree that you bear all risks associated with using or relying on that content. Altova will not be liable or responsible in any way for any content posted including, but not limited to, any errors or omissions in content, or for any losses or damage of any kind incurred as a result of the use of or reliance on any content. This disclaimer and limitation on liability is in addition to the disclaimers and limitations contained in the Website Terms of Use and elsewhere on the site.

.
.

transparent

transparent