Solved

How do I rename a node?

Posted on 2001-07-17
12
305 Views
Last Modified: 2011-10-03
I have an XML document - lots of them - how do I use the XML DOM to rename nodes within the document or create a new document with the reanmes nodes

eg
<a>
  <b>
   <data>
   </data>
  </b>
</a>
<x>
</x>

becomes

<first>
  <second>
    <data>
    </data>
  </second>
</first>
<x>
</x>

I think I may need to do some XSL - can anyone help
0
Comment
Question by:ShaunWilde
  • 5
  • 3
  • 3
  • +1
12 Comments
 
LVL 8

Expert Comment

by:Dave_Greene
Comment Utility
What language are you going to perform the conversion in?  I don't think you can do this in XSL, but who knows...
0
 

Expert Comment

by:xaviergeorge
Comment Utility
hi Shaun,
Since node Name is a ready only property, the solution i have suggested is a bit of a round about way.

The function requires 3 parameters to make it generic.
viz. oldName,newName and parentName

What u do here is remove the <oldName> node after keeping a pointer to all its children.

Create a new node with the name <newName> and append it
to parent Node. Then to this node append all the childeren to which we had kept pointers earlier.


function changeNodeName(oldName,newName,parentName) {
          xmldom = new ActiveXObject("MICROSOFT.XMLDOM")
          xmldom.load(zvon1.XMLDocument);
         
          t_ptr = xmldom.selectSingleNode("//" + oldName).childNodes    
          xmldom.selectSingleNode("//" + parentName).removeChild(xmldom.selectSingleNode("//" + oldName))
         
          newNode = xmldom.createNode(1,newName,"")          
          xmldom.selectSingleNode("//" + parentName).appendChild(newNode)
         
          for(i=0;i<t_ptr.length;++i) {
               xmldom.selectSingleNode("//" + parentName).childNodes(0).appendChild(t_ptr(i))
          }
          alert(xmldom.xml)
     }

I fell this code must work and hope it will be useful to.

rgds
xav
0
 
LVL 4

Expert Comment

by:chabaud
Comment Utility
Here is your XSLT stylesheet:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xsl:space="preserve">

<xsl:template match="a">
     <first><xsl:apply-templates/></first>
</xsl:template>

<xsl:template match="b">
     <second><xsl:apply-templates/></second>
</xsl:template>

<xsl:template match="/ | @* | node()">
     <xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy>
</xsl:template>

</xsl:stylesheet>
0
 

Expert Comment

by:xaviergeorge
Comment Utility
hi Shaun,
Since node Name is a ready only property, the solution i have suggested is a bit of a round about way.

The function requires 3 parameters to make it generic.
viz. oldName,newName and parentName

What u do here is remove the <oldName> node after keeping a pointer to all its children.

Create a new node with the name <newName> and append it
to parent Node. Then to this node append all the childeren to which we had kept pointers earlier.


function changeNodeName(oldName,newName,parentName) {
          xmldom = new ActiveXObject("MICROSOFT.XMLDOM")
          xmldom.load(zvon1.XMLDocument);
         
          t_ptr = xmldom.selectSingleNode("//" + oldName).childNodes    
          xmldom.selectSingleNode("//" + parentName).removeChild(xmldom.selectSingleNode("//" + oldName))
         
          newNode = xmldom.createNode(1,newName,"")          
          xmldom.selectSingleNode("//" + parentName).appendChild(newNode)
         
          for(i=0;i<t_ptr.length;++i) {
               xmldom.selectSingleNode("//" + parentName).childNodes(0).appendChild(t_ptr(i))
          }
          alert(xmldom.xml)
     }

I fell this code must work and hope it will be useful to.

rgds
xav
0
 

Expert Comment

by:xaviergeorge
Comment Utility
sorry guys, i first gave the answer y'day.
came today and refreshed the page and lo,
my answer gets posted again. Me real sorry for it, but to some extent i feel it is the fault of the way this site ( i am only reffering to this functionality)  is build.
When i submit it should go to a page wihich inserts into the db my commenst/answers, redirect to another page which is the view page. Now if i refresh, only the view generating page is refreshed, so  repeat d/b entry does not happen.
Hope the suggestion is take in the right spirit.
cheers
xav
0
 
LVL 9

Author Comment

by:ShaunWilde
Comment Utility
xaviergeorge - that is why there is a Reload Question option at the top of the page - as I remember it will not let you post the same message multiple times within a certain time frame

chabaud - I was working on someting similar - I'll check yours out - my XSLT is awful :( - will the atributes be preserved also?
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 9

Author Comment

by:ShaunWilde
Comment Utility
chabaud - it works - with some mods as it didn't preserve the attributes of the node so I used xsl:copy-of eg

<xsl:template match="a">
    <first><xsl:copy-of select="@*"/><xsl:apply-templates/></first>
</xsl:template>

just one extra (if you don't mind)

if I had

<a NLSname="A" ...>
  <b NLSname="B" ...>
  </b>
</a>

how do I change it to

<X NLSname="x" ...>
  <Y NLSname="y" ...>
  </Y>
</X>

eg <a> always has the NLSName == A and I wish to change it to <X> with NLSName = x etc



0
 
LVL 4

Accepted Solution

by:
chabaud earned 100 total points
Comment Utility
Try something like this:

<xsl:template match="a">
   <first><xsl:attribute name="NLSname">x</xsl:attribute>
   <xsl:copy-of select="@* and not(@NLSname)"/><xsl:apply-templates/></first>
</xsl:template>
0
 
LVL 9

Author Comment

by:ShaunWilde
Comment Utility
I actually did it this way

<xsl:template match="a">
    <first>
          <xsl:copy-of select="@*"/>
          <xsl:attribute name="Name">x</xsl:attribute>
          <xsl:apply-templates/>
     </first>
</xsl:template>

but the effect is the same
0
 
LVL 9

Author Comment

by:ShaunWilde
Comment Utility
thanks - could you possibly comment on some of the lines and what they do  eg what @* means etc
0
 
LVL 4

Expert Comment

by:chabaud
Comment Utility
For your information,

@   attribute prefix
@*  all attributes matches

For more example and documentation (from Microsoft):

Patterns:
---------
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmconpatterns.asp

XSL developers guide:
---------------------
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmconxsldevelopersguide.asp

XSLT reference:
---------------
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk30/htm/xmrefxsltreference.asp

0
 
LVL 9

Author Comment

by:ShaunWilde
Comment Utility
thanks again - look out for more XSLT related questions from me - I am sure ther will be some
0

Featured Post

IT, Stop Being Called Into Every Meeting

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Introduction In my previous article (http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/SSIS/A_9150-Loading-XML-Using-SSIS.html) I showed you how the XML Source component can be used to load XML files into a SQL Server database, us…
Many times as a report developer I've been asked to display normalized data such as three rows with values Jack, Joe, and Bob as a single comma-separated string such as 'Jack, Joe, Bob', and vice versa.  Here's how to do it. 
This video discusses moving either the default database or any database to a new volume.
This video explains how to create simple products associated to Magento configurable product and offers fast way of their generation with Store Manager for Magento tool.

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now