472,368 Members | 2,462 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,368 software developers and data experts.

removing namespaces from an XML document

Hello,

I have an XML document similar to the following:

<DataItems>
<Data xmlns="http://www.me.com">
<DataInformation xmlns:a="http://www.me.com/ASettings"
xsi:type="a:Stuff1">
<a:Name>Matt</a:Name>
<a:TN>555-5555</a:TN>
</DataInformation>
</Data>
<Data xmlns="http://www.me.com">
<DataInformation xmlns:b="http://www.me.com/BSettings"
xsi:type="b:Stuff2">
<b:Name>Bob</b:Name>
<b:TN>555-6666</b:TN>
</DataInformation>
</Data>
</DataItems>

What I would like to do is take all the namespaces and throw them in
the garbage! For example, I want to remove the xmlns attribute from
the Data node, I want to remove all the "a" and "b" prefixes from all
the nodes, etc. I want the final outcome to look like the following:

<DataItems>
<Data>
<DataInformation type="Stuff1">
<Name>Matt</Name>
<TN>555-5555</TN>
</DataInformation>
</Data>
<Data>
<DataInformation type="Stuff2">
<Name>Bob</Name>
<TN>555-6666</TN>
</DataInformation>
</Data>
</DataItems>

I am using C++ and Microsoft's xml implementation (DOM). I have no
choice but to use the raw Microsoft interfaces.

Does anyone have a good idea of how to do this?

Thanks,
Matt
Jul 20 '05 #1
6 8152


Matt wrote:
I have an XML document similar to the following:

<DataItems>
<Data xmlns="http://www.me.com">
<DataInformation xmlns:a="http://www.me.com/ASettings"
xsi:type="a:Stuff1">
<a:Name>Matt</a:Name>
<a:TN>555-5555</a:TN>
</DataInformation>
</Data>
<Data xmlns="http://www.me.com">
<DataInformation xmlns:b="http://www.me.com/BSettings"
xsi:type="b:Stuff2">
<b:Name>Bob</b:Name>
<b:TN>555-6666</b:TN>
</DataInformation>
</Data>
</DataItems>

What I would like to do is take all the namespaces and throw them in
the garbage! For example, I want to remove the xmlns attribute from
the Data node, I want to remove all the "a" and "b" prefixes from all
the nodes, etc. I want the final outcome to look like the following:

<DataItems>
<Data>
<DataInformation type="Stuff1">
<Name>Matt</Name>
<TN>555-5555</TN>
</DataInformation>
</Data>
<Data>
<DataInformation type="Stuff2">
<Name>Bob</Name>
<TN>555-6666</TN>
</DataInformation>
</Data>
</DataItems>

I am using C++ and Microsoft's xml implementation (DOM). I have no
choice but to use the raw Microsoft interfaces.

Does anyone have a good idea of how to do this?


XSLT is good for such tasks, the following stylesheet throws out all
namespace prefixes from element and attribute nodes:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" encoding="UTF-8" />

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

<xsl:template match="*">
<xsl:element name="{local-name()}">
<xsl:apply-templates select="@* | node()" />
</xsl:element>
</xsl:template>

<xsl:template match="@*">
<xsl:attribute name="{local-name()}"><xsl:value-of select="."
/></xsl:attribute>
</xsl:template>

<xsl:template match="text() | processing-instruction() | comment()">
<xsl:copy />
</xsl:template>

</xsl:stylesheet>

The transformation is done with a JavaScript and MSXML 4 as follows (I
know you asked about C++ but I have never used MSXML with C++ thus I
hope you will be able to translate the JavaScript into C++):

var sourceDocument = new ActiveXObject('Msxml2.DOMDocument.4.0');
sourceDocument.async = false;
sourceDocument.preserveWhiteSpace = true;
sourceDocument.validateOnParse = false;
var loaded = sourceDocument.load('test20040408.xml');
if (loaded) {
var xslDocument = new ActiveXObject('Msxml2.DOMDocument.4.0');
xslDocument.async = false;
loaded = xslDocument.load('test20040408Xsl.xml');
if (loaded) {
var resultDocument = new ActiveXObject('Msxml2.DOMDocument.4.0');
sourceDocument.transformNodeToObject(xslDocument, resultDocument);
resultDocument.save('whatever.xml');
}
}

While I tested I have seen that the transformtion is not quite doing
what you want as you also seem to want to remove any "prefixes" in
attribute values so you need to change the stylesheet to use the
following template for attribute nodes:

<xsl:template match="@*">
<xsl:attribute name="{local-name()}">
<xsl:choose>
<xsl:when test="contains(., ':')">
<xsl:value-of select="substring-after(., ':')" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="." />
</xsl:otherwise>
</xsl:choose>
</xsl:attribute>
</xsl:template>
--

Martin Honnen
http://JavaScript.FAQTs.com/

Jul 20 '05 #2
Hey,

That's awesome!!! It works perfectly!

Thank you very much!!

Matt

*** Sent via Developersdex http://www.developersdex.com ***
Don't just participate in USENET...get rewarded for it!
Jul 20 '05 #3
Hi there, I have one more question about this.

If I have a document like ...

<ROOT>
<ITEMS>
<ITEM>
<DATA>01234567</DATA>
<NAME>Name1</NAME>
</ITEM>
<ITEM>
<DATA>76543210</DATA>
<NAME>Name2</NAME>
</ITEM>
</ITEMS>
</ROOT>

... how would I add the value of the NAME node as an attribute of the
DATA node ... for example ...

<ROOT>
<ITEMS>
<ITEM>
<DATA name="Name1">01234567</DATA>
</ITEM>
<ITEM>
<DATA name="Name2">76543210</DATA>
</ITEM>
</ITEMS>
</ROOT>

Sorry for my non understanding of XSL.

Matt

*** Sent via Developersdex http://www.developersdex.com ***
Don't just participate in USENET...get rewarded for it!
Jul 20 '05 #4
Hello, Matt!
You wrote on 12 Apr 2004 17:17:31 GMT:
[Sorry, skipped]

[xslt]
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>

<xsl:template match="ITEM">
<ITEM>
<DATA name="{NAME}">
<xsl:value-of select="DATA"/>
</DATA>
</ITEM>
</xsl:template>
</xsl:stylesheet>
[/xslt]

With best regards, Alex Shirshov.
Jul 20 '05 #5
Cool ... that does work, except for one problem. The DATA node has
several subnodes underneath it which get lost when the transform takes
place. I probably should have mentioned the fact that there are subnodes
underneath, eh?

So the document is more like:

<ROOT>
<ITEMS>
<ITEM>
<DATA>
<THIS>121212</THIS>
<THAT>121212</THAT>
</DATA>
<NAME>name1</name>
</ITEM>
<ITEM>
<DATA>
<ONE>121212</ONE>
<TWO>121212</TWO>
</DATA>
<NAME>name2</name>
</ITEM>
</ITEMS>
</ROOT>

I want to preserve all the nodes underneath data. Data can contain
several different types of nodes. Sorry I didn't mention this in the
initial posting.

Thanks for your assistance!

Matt

*** Sent via Developersdex http://www.developersdex.com ***
Don't just participate in USENET...get rewarded for it!
Jul 20 '05 #6
Hello, Matt!
You wrote on 13 Apr 2004 12:57:24 GMT:
[Sorry, skipped]

Oh, it's simple.
Replace the
[xslt]
<DATA name="{NAME}">
<xsl:value-of select="DATA"/>
</DATA>
[/xslt]
on
[xslt]
<DATA name="{NAME}">
<xsl:apply-templates select="*[not(self::NAME)]"/>
</DATA>

[/xslt]

With best regards, Alex Shirshov.
Jul 20 '05 #7

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Greg Rothlander | last post by:
I posted this a few days ago and didn't get any response. I try again but ask it a little differently. I'm recieving any XML document from a client and I need to convert it to an ASCII delimited...
1
by: Maziar Aflatoun | last post by:
Hello, I have a string variable that contains XML data with many different namespaces. I like to remove all the namespaces from my XML (clean the XML). What's the quickest way to do this? Ex....
11
by: EAI | last post by:
Hi All, I have a XML of the following form <?xml version="1.0"?> <xxxx xmlns="http://xxx.xxx.com"> .... </xxxx> When I try to read xml using SelectSingleNode, I am getting exception
36
by: Wilfredo Sánchez Vega | last post by:
I'm having some issues around namespace handling with XML: >>> document = xml.dom.minidom.Document() >>> element = document.createElementNS("DAV:", "href") >>> document.appendChild(element)...
6
by: fzhang | last post by:
I am relatively new to XML and C#. So, forgive me if this question is too newbie. :-) While assuming this is an easy programming task, I couldn't find a single reference anywhere for how to do...
7
by: Simon Hart | last post by:
Hi, I have a requirement to remove the xmlns from the DOM in order to pass over to MS CRM 3.0 Fetch method.It seems the fetch method blows up if there is a xmlns present!?! The reason I have a...
3
by: Keith Patrick | last post by:
I'm doing some document merging where I want to bring in an XmlDocument and import its document element into another document deeper in its tree. However, when serializing my underlying objects,...
10
by: Andy Fish | last post by:
hi, I have an XSLT which is producing XML output. many of the nodes in the output tree contain namespace declarations for namespaces that are used in the source document even though they are...
20
by: Steve | last post by:
With the help of this newsgroup and Google I have got this code working fully in Firefox and can alert the XML in IE but because IE does not impliment the DOM "getElementsByTagNameNS()" function I...
2
by: Kemmylinns12 | last post by:
Blockchain technology has emerged as a transformative force in the business world, offering unprecedented opportunities for innovation and efficiency. While initially associated with cryptocurrencies...
0
by: Naresh1 | last post by:
What is WebLogic Admin Training? WebLogic Admin Training is a specialized program designed to equip individuals with the skills and knowledge required to effectively administer and manage Oracle...
0
by: antdb | last post by:
Ⅰ. Advantage of AntDB: hyper-convergence + streaming processing engine In the overall architecture, a new "hyper-convergence" concept was proposed, which integrated multiple engines and...
0
hi
by: WisdomUfot | last post by:
It's an interesting question you've got about how Gmail hides the HTTP referrer when a link in an email is clicked. While I don't have the specific technical details, Gmail likely implements measures...
0
Oralloy
by: Oralloy | last post by:
Hello Folks, I am trying to hook up a CPU which I designed using SystemC to I/O pins on an FPGA. My problem (spelled failure) is with the synthesis of my design into a bitstream, not the C++...
0
BLUEPANDA
by: BLUEPANDA | last post by:
At BluePanda Dev, we're passionate about building high-quality software and sharing our knowledge with the community. That's why we've created a SaaS starter kit that's not only easy to use but also...
1
by: Johno34 | last post by:
I have this click event on my form. It speaks to a Datasheet Subform Private Sub Command260_Click() Dim r As DAO.Recordset Set r = Form_frmABCD.Form.RecordsetClone r.MoveFirst Do If...
1
by: ezappsrUS | last post by:
Hi, I wonder if someone knows where I am going wrong below. I have a continuous form and two labels where only one would be visible depending on the checkbox being checked or not. Below is the...
0
by: jack2019x | last post by:
hello, Is there code or static lib for hook swapchain present? I wanna hook dxgi swapchain present for dx11 and dx9.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.