471,073 Members | 1,142 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

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

Add XmlNode

Here I have the definition of an XmlNode which is a property (PayPreference)
on my Customer class containing an enum describing how the customer will
pay.

<PayPerference xsi:type="a4:Customer+CustomerPayOptions"
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken%3Dnull">cash</PayPerference>

I now want to add this XmlNode to a different Xml file where the Customer
class has not defined a PayPreference property. I get as far as locating
the parent XmlNode (Customer). Now I just need to add the XmlNode defined
above. To do this, I understand that I need to ask the XmlDocument to
create the node first before I ask the Customer node to 'AppendChild'. I
notice 3 overloads of CreateElement on the XmlDocument to do this:

CreateElement(string name)
CreateElement(string qualifiedName, string namespaceURI)
CreateElement(string prefix, string localName, string namespaceURI)

So now I'm stuck as to what I need to do now. Any help would be
appreciated!


Nov 12 '05 #1
5 4960
Hi Paul,

Welcome to MSDN newsgroup.
Regarding the adding XmlNode into XmlDocument question you mentioned, we
can just use the XmlDocument.CreateElement to create a Element xml node and
then locate the parent node where we want to append the new element. Then,
we can use the XmlElement(XmlNode) 's AppendChild method to add the new
element. Also, in your scenario, your element has some additional
namespace declaration attributes, we need to append them into the new
element or in the document also. here is a simple example on creating a new
xmlelement and add into a existing xmldoument:

the original document is like:

=================
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="http://www.mytest.org">
<datas>
<data id="1">
<item>fsfdsfs</item>
</data>
<data id="2">
<item>fksfjkdsjfdks</item>
</data>
</datas>
</root>
===================

the code that modify the document is:
====================
static void RunXmlDoc()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"..\..\testxml.xml");

XmlElement elm = doc.CreateElement("PayPerference");

elm.InnerText = "cash";
XmlAttribute nsattr = null;

nsattr =
doc.CreateAttribute("xmlns","xsi","http://www.w3.org/2000/xmlns/");
nsattr.InnerText = "http://www.w3.org/2001/XMLSchema-instance";

elm.Attributes.Append(
nsattr
);

//
nsattr =
doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
nsattr.InnerText =
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";

elm.Attributes.Append(
nsattr
);
nsattr =
doc.CreateAttribute("xsi","type","http://www.w3.org/2001/XMLSchema-instance"
);
nsattr.InnerText = "a4:Customer+CustomerPayOptions";
elm.Attributes.Append(
nsattr
);

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("ns1","http://www.mytest.org");

XmlElement datas = doc.SelectSingleNode("/ns1:root/ns1:datas",manager)
as XmlElement;

datas.AppendChild(elm);

Console.WriteLine(doc.OuterXml);

doc.Save("output.xml");

}
===========================

The output.xml will be something like;

========================
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.mytest.org">
<datas>
<data id="1">
<item>fsfdsfs</item>
</data>
<data id="2">
<item>fksfjkdsjfdks</item>
</data>
<PayPerference xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
%3Dnull" xsi:type="a4:Customer+CustomerPayOptions"
xmlns="">cash</PayPerference>
</datas>
</root>
============================

Also, you can find the the "PayPerference" element in the output has an
empty default namespace

xmlns=""

you can explicitly specify the default namespace by changing the
XmlElement's construction to below:

XmlElement elm =
doc.CreateElement("PayPerference","http://www.mycustomapp.com");

Hope helps. Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

--------------------
| From: "Paul" <pa*****@community.nospam>
| Subject: Add XmlNode
| Date: Wed, 26 Oct 2005 11:29:29 -0700
| Lines: 28
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <uh*************@TK2MSFTNGP15.phx.gbl>
| Newsgroups: microsoft.public.dotnet.xml
| NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP15.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9085
| X-Tomcat-NG: microsoft.public.dotnet.xml
|
| Here I have the definition of an XmlNode which is a property
(PayPreference)
| on my Customer class containing an enum describing how the customer will
| pay.
|
| <PayPerference xsi:type="a4:Customer+CustomerPayOptions"
|
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
%3Dnull">cash</PayPerference>
|
| I now want to add this XmlNode to a different Xml file where the Customer
| class has not defined a PayPreference property. I get as far as locating
| the parent XmlNode (Customer). Now I just need to add the XmlNode
defined
| above. To do this, I understand that I need to ask the XmlDocument to
| create the node first before I ask the Customer node to 'AppendChild'. I
| notice 3 overloads of CreateElement on the XmlDocument to do this:
|
| CreateElement(string name)
| CreateElement(string qualifiedName, string namespaceURI)
| CreateElement(string prefix, string localName, string namespaceURI)
|
| So now I'm stuck as to what I need to do now. Any help would be
| appreciated!
|
|
|
|
|
|
|
|
|

Nov 12 '05 #2
Hello Steven and thank you for your reply!!

Your solution worked well and it seems that
the part I was missing was that I needed to ask
the document to create the new XmlAttribute and not
the newly created node.

I do have a followup question. In your solution you hard-
code the namespace prefix 'a4' as follows:

doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
nsattr.InnerText =
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";
But what if I don't know what the prefix is? It seems that I should ask the
document
to generate a new one for me if one doesn't already exist. But on
XmlDocument I only
see:

GetPrefixOfNamespace and
GetNamespaceOfPrefix

Paul

"Steven Cheng[MSFT]" <st*****@online.microsoft.com> wrote in message
news:z%******************@TK2MSFTNGXA01.phx.gbl...
Hi Paul,

Welcome to MSDN newsgroup.
Regarding the adding XmlNode into XmlDocument question you mentioned, we
can just use the XmlDocument.CreateElement to create a Element xml node
and
then locate the parent node where we want to append the new element. Then,
we can use the XmlElement(XmlNode) 's AppendChild method to add the new
element. Also, in your scenario, your element has some additional
namespace declaration attributes, we need to append them into the new
element or in the document also. here is a simple example on creating a
new
xmlelement and add into a existing xmldoument:

the original document is like:

=================
<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="http://www.mytest.org">
<datas>
<data id="1">
<item>fsfdsfs</item>
</data>
<data id="2">
<item>fksfjkdsjfdks</item>
</data>
</datas>
</root>
===================

the code that modify the document is:
====================
static void RunXmlDoc()
{
XmlDocument doc = new XmlDocument();
doc.Load(@"..\..\testxml.xml");

XmlElement elm = doc.CreateElement("PayPerference");

elm.InnerText = "cash";
XmlAttribute nsattr = null;

nsattr =
doc.CreateAttribute("xmlns","xsi","http://www.w3.org/2000/xmlns/");
nsattr.InnerText = "http://www.w3.org/2001/XMLSchema-instance";

elm.Attributes.Append(
nsattr
);

//
nsattr =
doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
nsattr.InnerText =
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";

elm.Attributes.Append(
nsattr
);
nsattr =
doc.CreateAttribute("xsi","type","http://www.w3.org/2001/XMLSchema-instance"
);
nsattr.InnerText = "a4:Customer+CustomerPayOptions";
elm.Attributes.Append(
nsattr
);

XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
manager.AddNamespace("ns1","http://www.mytest.org");

XmlElement datas = doc.SelectSingleNode("/ns1:root/ns1:datas",manager)
as XmlElement;

datas.AppendChild(elm);

Console.WriteLine(doc.OuterXml);

doc.Save("output.xml");

}
===========================

The output.xml will be something like;

========================
<?xml version="1.0" encoding="utf-8"?>
<root xmlns="http://www.mytest.org">
<datas>
<data id="1">
<item>fsfdsfs</item>
</data>
<data id="2">
<item>fksfjkdsjfdks</item>
</data>
<PayPerference xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
%3Dnull" xsi:type="a4:Customer+CustomerPayOptions"
xmlns="">cash</PayPerference>
</datas>
</root>
============================

Also, you can find the the "PayPerference" element in the output has an
empty default namespace

xmlns=""

you can explicitly specify the default namespace by changing the
XmlElement's construction to below:

XmlElement elm =
doc.CreateElement("PayPerference","http://www.mycustomapp.com");

Hope helps. Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

--------------------
| From: "Paul" <pa*****@community.nospam>
| Subject: Add XmlNode
| Date: Wed, 26 Oct 2005 11:29:29 -0700
| Lines: 28
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <uh*************@TK2MSFTNGP15.phx.gbl>
| Newsgroups: microsoft.public.dotnet.xml
| NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP15.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9085
| X-Tomcat-NG: microsoft.public.dotnet.xml
|
| Here I have the definition of an XmlNode which is a property
(PayPreference)
| on my Customer class containing an enum describing how the customer will
| pay.
|
| <PayPerference xsi:type="a4:Customer+CustomerPayOptions"
|
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
%3Dnull">cash</PayPerference>
|
| I now want to add this XmlNode to a different Xml file where the
Customer
| class has not defined a PayPreference property. I get as far as
locating
| the parent XmlNode (Customer). Now I just need to add the XmlNode
defined
| above. To do this, I understand that I need to ask the XmlDocument to
| create the node first before I ask the Customer node to 'AppendChild'.
I
| notice 3 overloads of CreateElement on the XmlDocument to do this:
|
| CreateElement(string name)
| CreateElement(string qualifiedName, string namespaceURI)
| CreateElement(string prefix, string localName, string namespaceURI)
|
| So now I'm stuck as to what I need to do now. Any help would be
| appreciated!
|
|
|
|
|
|
|
|
|

Nov 12 '05 #3
Thanks for your response Paul,

As for namespace prefix, it doesn't matter much. Namespace prefix is just
like an alias of the actual Namespace URI, so we can choose discretionary
ones as we like. And prefix value won't make XML document different as
long as the Namespace URI is the same between multiple documents.
e.g.

the following xmlelement is identical to each other:
[1]
<ns0:hello xmlns:ns0="http://www.hello.org" >
<ns0:helloWorld>hello</ns0:helloWorld>
</ns0:hello>

[2]
<ns1:hello xmlns:ns1="http://www.hello.org">
<ns1:helloWorld>hello</ns1:helloWorld>
</ns1:hello>

though the namespace prefix is different( "ns0" and "ns1"), their actual
Namespace URI are the same. So they're identical.

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

--------------------
| From: "Paul" <pa*****@community.nospam>
| References: <uh*************@TK2MSFTNGP15.phx.gbl>
<z#**************@TK2MSFTNGXA01.phx.gbl>
| Subject: Re: Add XmlNode
| Date: Thu, 27 Oct 2005 10:04:59 -0700
| Lines: 222
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <OY**************@TK2MSFTNGP10.phx.gbl>
| Newsgroups: microsoft.public.dotnet.xml
| NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9100
| X-Tomcat-NG: microsoft.public.dotnet.xml
|
| Hello Steven and thank you for your reply!!
|
| Your solution worked well and it seems that
| the part I was missing was that I needed to ask
| the document to create the new XmlAttribute and not
| the newly created node.
|
| I do have a followup question. In your solution you hard-
| code the namespace prefix 'a4' as follows:
|
| doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
| nsattr.InnerText =
|
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
|
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";
|
|
| But what if I don't know what the prefix is? It seems that I should ask
the
| document
| to generate a new one for me if one doesn't already exist. But on
| XmlDocument I only
| see:
|
| GetPrefixOfNamespace and
| GetNamespaceOfPrefix
|
| Paul
|
|
|
| "Steven Cheng[MSFT]" <st*****@online.microsoft.com> wrote in message
| news:z%******************@TK2MSFTNGXA01.phx.gbl...
| > Hi Paul,
| >
| > Welcome to MSDN newsgroup.
| > Regarding the adding XmlNode into XmlDocument question you mentioned, we
| > can just use the XmlDocument.CreateElement to create a Element xml node
| > and
| > then locate the parent node where we want to append the new element.
Then,
| > we can use the XmlElement(XmlNode) 's AppendChild method to add the new
| > element. Also, in your scenario, your element has some additional
| > namespace declaration attributes, we need to append them into the new
| > element or in the document also. here is a simple example on creating a
| > new
| > xmlelement and add into a existing xmldoument:
| >
| > the original document is like:
| >
| > =================
| > <?xml version="1.0" encoding="utf-8" ?>
| > <root xmlns="http://www.mytest.org">
| > <datas>
| > <data id="1">
| > <item>fsfdsfs</item>
| > </data>
| > <data id="2">
| > <item>fksfjkdsjfdks</item>
| > </data>
| > </datas>
| > </root>
| > ===================
| >
| > the code that modify the document is:
| > ====================
| > static void RunXmlDoc()
| > {
| > XmlDocument doc = new XmlDocument();
| > doc.Load(@"..\..\testxml.xml");
| >
| > XmlElement elm = doc.CreateElement("PayPerference");
| >
| > elm.InnerText = "cash";
| >
| >
| > XmlAttribute nsattr = null;
| >
| > nsattr =
| > doc.CreateAttribute("xmlns","xsi","http://www.w3.org/2000/xmlns/");
| > nsattr.InnerText = "http://www.w3.org/2001/XMLSchema-instance";
| >
| > elm.Attributes.Append(
| > nsattr
| > );
| >
| > //
| > nsattr =
| > doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
| > nsattr.InnerText =
| >
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
| >
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";
| >
| > elm.Attributes.Append(
| > nsattr
| > );
| >
| >
| > nsattr =
| >
doc.CreateAttribute("xsi","type","http://www.w3.org/2001/XMLSchema-instance"
| > );
| > nsattr.InnerText = "a4:Customer+CustomerPayOptions";
| > elm.Attributes.Append(
| > nsattr
| > );
| >
| > XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
| > manager.AddNamespace("ns1","http://www.mytest.org");
| >
| > XmlElement datas = doc.SelectSingleNode("/ns1:root/ns1:datas",manager)
| > as XmlElement;
| >
| > datas.AppendChild(elm);
| >
| >
| >
| > Console.WriteLine(doc.OuterXml);
| >
| > doc.Save("output.xml");
| >
| > }
| > ===========================
| >
| > The output.xml will be something like;
| >
| > ========================
| > <?xml version="1.0" encoding="utf-8"?>
| > <root xmlns="http://www.mytest.org">
| > <datas>
| > <data id="1">
| > <item>fsfdsfs</item>
| > </data>
| > <data id="2">
| > <item>fksfjkdsjfdks</item>
| > </data>
| > <PayPerference xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| >
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
| >
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
| > %3Dnull" xsi:type="a4:Customer+CustomerPayOptions"
| > xmlns="">cash</PayPerference>
| > </datas>
| > </root>
| > ============================
| >
| > Also, you can find the the "PayPerference" element in the output has an
| > empty default namespace
| >
| > xmlns=""
| >
| > you can explicitly specify the default namespace by changing the
| > XmlElement's construction to below:
| >
| > XmlElement elm =
| > doc.CreateElement("PayPerference","http://www.mycustomapp.com");
| >
| > Hope helps. Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| >
| >
| > --------------------
| > | From: "Paul" <pa*****@community.nospam>
| > | Subject: Add XmlNode
| > | Date: Wed, 26 Oct 2005 11:29:29 -0700
| > | Lines: 28
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <uh*************@TK2MSFTNGP15.phx.gbl>
| > | Newsgroups: microsoft.public.dotnet.xml
| > | NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP15.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9085
| > | X-Tomcat-NG: microsoft.public.dotnet.xml
| > |
| > | Here I have the definition of an XmlNode which is a property
| > (PayPreference)
| > | on my Customer class containing an enum describing how the customer
will
| > | pay.
| > |
| > | <PayPerference xsi:type="a4:Customer+CustomerPayOptions"
| > |
| >
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
| >
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
| > %3Dnull">cash</PayPerference>
| > |
| > | I now want to add this XmlNode to a different Xml file where the
| > Customer
| > | class has not defined a PayPreference property. I get as far as
| > locating
| > | the parent XmlNode (Customer). Now I just need to add the XmlNode
| > defined
| > | above. To do this, I understand that I need to ask the XmlDocument to
| > | create the node first before I ask the Customer node to
'AppendChild'.
| > I
| > | notice 3 overloads of CreateElement on the XmlDocument to do this:
| > |
| > | CreateElement(string name)
| > | CreateElement(string qualifiedName, string namespaceURI)
| > | CreateElement(string prefix, string localName, string
namespaceURI)
| > |
| > | So now I'm stuck as to what I need to do now. Any help would be
| > | appreciated!
| > |
| > |
| > |
| > |
| > |
| > |
| > |
| > |
| > |
| >
|
|
|

Nov 12 '05 #4
Thanks again, Steven.

Based on your response, the approach I'm going to take is to generate the
prefixes myself which I've implemented and it appears to work.

Anyway, your help got me out of a corner, thank you.

Paul

"Steven Cheng[MSFT]" <st*****@online.microsoft.com> wrote in message
news:sp**************@TK2MSFTNGXA01.phx.gbl...
Thanks for your response Paul,

As for namespace prefix, it doesn't matter much. Namespace prefix is just
like an alias of the actual Namespace URI, so we can choose discretionary
ones as we like. And prefix value won't make XML document different as
long as the Namespace URI is the same between multiple documents.
e.g.

the following xmlelement is identical to each other:
[1]
<ns0:hello xmlns:ns0="http://www.hello.org" >
<ns0:helloWorld>hello</ns0:helloWorld>
</ns0:hello>

[2]
<ns1:hello xmlns:ns1="http://www.hello.org">
<ns1:helloWorld>hello</ns1:helloWorld>
</ns1:hello>

though the namespace prefix is different( "ns0" and "ns1"), their actual
Namespace URI are the same. So they're identical.

Thanks,

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)

--------------------
| From: "Paul" <pa*****@community.nospam>
| References: <uh*************@TK2MSFTNGP15.phx.gbl>
<z#**************@TK2MSFTNGXA01.phx.gbl>
| Subject: Re: Add XmlNode
| Date: Thu, 27 Oct 2005 10:04:59 -0700
| Lines: 222
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <OY**************@TK2MSFTNGP10.phx.gbl>
| Newsgroups: microsoft.public.dotnet.xml
| NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9100
| X-Tomcat-NG: microsoft.public.dotnet.xml
|
| Hello Steven and thank you for your reply!!
|
| Your solution worked well and it seems that
| the part I was missing was that I needed to ask
| the document to create the new XmlAttribute and not
| the newly created node.
|
| I do have a followup question. In your solution you hard-
| code the namespace prefix 'a4' as follows:
|
| doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
| nsattr.InnerText =
|
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
|
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";
|
|
| But what if I don't know what the prefix is? It seems that I should ask
the
| document
| to generate a new one for me if one doesn't already exist. But on
| XmlDocument I only
| see:
|
| GetPrefixOfNamespace and
| GetNamespaceOfPrefix
|
| Paul
|
|
|
| "Steven Cheng[MSFT]" <st*****@online.microsoft.com> wrote in message
| news:z%******************@TK2MSFTNGXA01.phx.gbl...
| > Hi Paul,
| >
| > Welcome to MSDN newsgroup.
| > Regarding the adding XmlNode into XmlDocument question you mentioned,
we
| > can just use the XmlDocument.CreateElement to create a Element xml
node
| > and
| > then locate the parent node where we want to append the new element.
Then,
| > we can use the XmlElement(XmlNode) 's AppendChild method to add the
new
| > element. Also, in your scenario, your element has some additional
| > namespace declaration attributes, we need to append them into the new
| > element or in the document also. here is a simple example on creating
a
| > new
| > xmlelement and add into a existing xmldoument:
| >
| > the original document is like:
| >
| > =================
| > <?xml version="1.0" encoding="utf-8" ?>
| > <root xmlns="http://www.mytest.org">
| > <datas>
| > <data id="1">
| > <item>fsfdsfs</item>
| > </data>
| > <data id="2">
| > <item>fksfjkdsjfdks</item>
| > </data>
| > </datas>
| > </root>
| > ===================
| >
| > the code that modify the document is:
| > ====================
| > static void RunXmlDoc()
| > {
| > XmlDocument doc = new XmlDocument();
| > doc.Load(@"..\..\testxml.xml");
| >
| > XmlElement elm = doc.CreateElement("PayPerference");
| >
| > elm.InnerText = "cash";
| >
| >
| > XmlAttribute nsattr = null;
| >
| > nsattr =
| > doc.CreateAttribute("xmlns","xsi","http://www.w3.org/2000/xmlns/");
| > nsattr.InnerText = "http://www.w3.org/2001/XMLSchema-instance";
| >
| > elm.Attributes.Append(
| > nsattr
| > );
| >
| > //
| > nsattr =
| > doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
| > nsattr.InnerText =
| >
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
| >
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";
| >
| > elm.Attributes.Append(
| > nsattr
| > );
| >
| >
| > nsattr =
| >
doc.CreateAttribute("xsi","type","http://www.w3.org/2001/XMLSchema-instance"
| > );
| > nsattr.InnerText = "a4:Customer+CustomerPayOptions";
| > elm.Attributes.Append(
| > nsattr
| > );
| >
| > XmlNamespaceManager manager = new XmlNamespaceManager(doc.NameTable);
| > manager.AddNamespace("ns1","http://www.mytest.org");
| >
| > XmlElement datas = doc.SelectSingleNode("/ns1:root/ns1:datas",manager)
| > as XmlElement;
| >
| > datas.AppendChild(elm);
| >
| >
| >
| > Console.WriteLine(doc.OuterXml);
| >
| > doc.Save("output.xml");
| >
| > }
| > ===========================
| >
| > The output.xml will be something like;
| >
| > ========================
| > <?xml version="1.0" encoding="utf-8"?>
| > <root xmlns="http://www.mytest.org">
| > <datas>
| > <data id="1">
| > <item>fsfdsfs</item>
| > </data>
| > <data id="2">
| > <item>fksfjkdsjfdks</item>
| > </data>
| > <PayPerference
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| >
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
| >
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
| > %3Dnull" xsi:type="a4:Customer+CustomerPayOptions"
| > xmlns="">cash</PayPerference>
| > </datas>
| > </root>
| > ============================
| >
| > Also, you can find the the "PayPerference" element in the output has
an
| > empty default namespace
| >
| > xmlns=""
| >
| > you can explicitly specify the default namespace by changing the
| > XmlElement's construction to below:
| >
| > XmlElement elm =
| > doc.CreateElement("PayPerference","http://www.mycustomapp.com");
| >
| > Hope helps. Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| >
| >
| > --------------------
| > | From: "Paul" <pa*****@community.nospam>
| > | Subject: Add XmlNode
| > | Date: Wed, 26 Oct 2005 11:29:29 -0700
| > | Lines: 28
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <uh*************@TK2MSFTNGP15.phx.gbl>
| > | Newsgroups: microsoft.public.dotnet.xml
| > | NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| > | Path:
TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP15.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9085
| > | X-Tomcat-NG: microsoft.public.dotnet.xml
| > |
| > | Here I have the definition of an XmlNode which is a property
| > (PayPreference)
| > | on my Customer class containing an enum describing how the customer
will
| > | pay.
| > |
| > | <PayPerference xsi:type="a4:Customer+CustomerPayOptions"
| > |
| >
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
| >
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
| > %3Dnull">cash</PayPerference>
| > |
| > | I now want to add this XmlNode to a different Xml file where the
| > Customer
| > | class has not defined a PayPreference property. I get as far as
| > locating
| > | the parent XmlNode (Customer). Now I just need to add the XmlNode
| > defined
| > | above. To do this, I understand that I need to ask the XmlDocument
to
| > | create the node first before I ask the Customer node to
'AppendChild'.
| > I
| > | notice 3 overloads of CreateElement on the XmlDocument to do this:
| > |
| > | CreateElement(string name)
| > | CreateElement(string qualifiedName, string namespaceURI)
| > | CreateElement(string prefix, string localName, string
namespaceURI)
| > |
| > | So now I'm stuck as to what I need to do now. Any help would be
| > | appreciated!
| > |
| > |
| > |
| > |
| > |
| > |
| > |
| > |
| > |
| >
|
|
|

Nov 12 '05 #5
You're welcome Paul.

Good luck!

Steven Cheng
Microsoft Online Support

Get Secure! www.microsoft.com/security
(This posting is provided "AS IS", with no warranties, and confers no
rights.)
--------------------
| From: "Paul" <pa*****@community.nospam>
| References: <uh*************@TK2MSFTNGP15.phx.gbl>
<z#**************@TK2MSFTNGXA01.phx.gbl>
<OY**************@TK2MSFTNGP10.phx.gbl>
<sp**************@TK2MSFTNGXA01.phx.gbl>
| Subject: Re: Add XmlNode
| Date: Fri, 28 Oct 2005 11:32:13 -0700
| Lines: 311
| X-Priority: 3
| X-MSMail-Priority: Normal
| X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| X-RFC2646: Format=Flowed; Original
| Message-ID: <Oi**************@TK2MSFTNGP12.phx.gbl>
| Newsgroups: microsoft.public.dotnet.xml
| NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP12.phx.gbl
| Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9111
| X-Tomcat-NG: microsoft.public.dotnet.xml
|
| Thanks again, Steven.
|
| Based on your response, the approach I'm going to take is to generate the
| prefixes myself which I've implemented and it appears to work.
|
| Anyway, your help got me out of a corner, thank you.
|
| Paul
|
| "Steven Cheng[MSFT]" <st*****@online.microsoft.com> wrote in message
| news:sp**************@TK2MSFTNGXA01.phx.gbl...
| > Thanks for your response Paul,
| >
| > As for namespace prefix, it doesn't matter much. Namespace prefix is
just
| > like an alias of the actual Namespace URI, so we can choose
discretionary
| > ones as we like. And prefix value won't make XML document different as
| > long as the Namespace URI is the same between multiple documents.
| > e.g.
| >
| > the following xmlelement is identical to each other:
| > [1]
| > <ns0:hello xmlns:ns0="http://www.hello.org" >
| > <ns0:helloWorld>hello</ns0:helloWorld>
| > </ns0:hello>
| >
| > [2]
| > <ns1:hello xmlns:ns1="http://www.hello.org">
| > <ns1:helloWorld>hello</ns1:helloWorld>
| > </ns1:hello>
| >
| > though the namespace prefix is different( "ns0" and "ns1"), their actual
| > Namespace URI are the same. So they're identical.
| >
| > Thanks,
| >
| > Steven Cheng
| > Microsoft Online Support
| >
| > Get Secure! www.microsoft.com/security
| > (This posting is provided "AS IS", with no warranties, and confers no
| > rights.)
| >
| >
| >
| > --------------------
| > | From: "Paul" <pa*****@community.nospam>
| > | References: <uh*************@TK2MSFTNGP15.phx.gbl>
| > <z#**************@TK2MSFTNGXA01.phx.gbl>
| > | Subject: Re: Add XmlNode
| > | Date: Thu, 27 Oct 2005 10:04:59 -0700
| > | Lines: 222
| > | X-Priority: 3
| > | X-MSMail-Priority: Normal
| > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | X-RFC2646: Format=Flowed; Original
| > | Message-ID: <OY**************@TK2MSFTNGP10.phx.gbl>
| > | Newsgroups: microsoft.public.dotnet.xml
| > | NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| > | Path: TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP10.phx.gbl
| > | Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9100
| > | X-Tomcat-NG: microsoft.public.dotnet.xml
| > |
| > | Hello Steven and thank you for your reply!!
| > |
| > | Your solution worked well and it seems that
| > | the part I was missing was that I needed to ask
| > | the document to create the new XmlAttribute and not
| > | the newly created node.
| > |
| > | I do have a followup question. In your solution you hard-
| > | code the namespace prefix 'a4' as follows:
| > |
| > | doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
| > | nsattr.InnerText =
| > |
| >
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
| > |
| >
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";
| > |
| > |
| > | But what if I don't know what the prefix is? It seems that I should
ask
| > the
| > | document
| > | to generate a new one for me if one doesn't already exist. But on
| > | XmlDocument I only
| > | see:
| > |
| > | GetPrefixOfNamespace and
| > | GetNamespaceOfPrefix
| > |
| > | Paul
| > |
| > |
| > |
| > | "Steven Cheng[MSFT]" <st*****@online.microsoft.com> wrote in message
| > | news:z%******************@TK2MSFTNGXA01.phx.gbl...
| > | > Hi Paul,
| > | >
| > | > Welcome to MSDN newsgroup.
| > | > Regarding the adding XmlNode into XmlDocument question you
mentioned,
| > we
| > | > can just use the XmlDocument.CreateElement to create a Element xml
| > node
| > | > and
| > | > then locate the parent node where we want to append the new element.
| > Then,
| > | > we can use the XmlElement(XmlNode) 's AppendChild method to add the
| > new
| > | > element. Also, in your scenario, your element has some additional
| > | > namespace declaration attributes, we need to append them into the
new
| > | > element or in the document also. here is a simple example on
creating
| > a
| > | > new
| > | > xmlelement and add into a existing xmldoument:
| > | >
| > | > the original document is like:
| > | >
| > | > =================
| > | > <?xml version="1.0" encoding="utf-8" ?>
| > | > <root xmlns="http://www.mytest.org">
| > | > <datas>
| > | > <data id="1">
| > | > <item>fsfdsfs</item>
| > | > </data>
| > | > <data id="2">
| > | > <item>fksfjkdsjfdks</item>
| > | > </data>
| > | > </datas>
| > | > </root>
| > | > ===================
| > | >
| > | > the code that modify the document is:
| > | > ====================
| > | > static void RunXmlDoc()
| > | > {
| > | > XmlDocument doc = new XmlDocument();
| > | > doc.Load(@"..\..\testxml.xml");
| > | >
| > | > XmlElement elm = doc.CreateElement("PayPerference");
| > | >
| > | > elm.InnerText = "cash";
| > | >
| > | >
| > | > XmlAttribute nsattr = null;
| > | >
| > | > nsattr =
| > | > doc.CreateAttribute("xmlns","xsi","http://www.w3.org/2000/xmlns/");
| > | > nsattr.InnerText = "http://www.w3.org/2001/XMLSchema-instance";
| > | >
| > | > elm.Attributes.Append(
| > | > nsattr
| > | > );
| > | >
| > | > //
| > | > nsattr =
| > | > doc.CreateAttribute("xmlns","a4","http://www.w3.org/2000/xmlns/");
| > | > nsattr.InnerText =
| > | >
| >
"http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage/OsfDomai
| > | >
| >
n%2C%20Version%3D1.0.0.1%2C%20Culture%3Dneutral%2C %20PublicKeyToken%3Dnull";
| > | >
| > | > elm.Attributes.Append(
| > | > nsattr
| > | > );
| > | >
| > | >
| > | > nsattr =
| > | >
| >
doc.CreateAttribute("xsi","type","http://www.w3.org/2001/XMLSchema-instance"
| > | > );
| > | > nsattr.InnerText = "a4:Customer+CustomerPayOptions";
| > | > elm.Attributes.Append(
| > | > nsattr
| > | > );
| > | >
| > | > XmlNamespaceManager manager = new
XmlNamespaceManager(doc.NameTable);
| > | > manager.AddNamespace("ns1","http://www.mytest.org");
| > | >
| > | > XmlElement datas =
doc.SelectSingleNode("/ns1:root/ns1:datas",manager)
| > | > as XmlElement;
| > | >
| > | > datas.AppendChild(elm);
| > | >
| > | >
| > | >
| > | > Console.WriteLine(doc.OuterXml);
| > | >
| > | > doc.Save("output.xml");
| > | >
| > | > }
| > | > ===========================
| > | >
| > | > The output.xml will be something like;
| > | >
| > | > ========================
| > | > <?xml version="1.0" encoding="utf-8"?>
| > | > <root xmlns="http://www.mytest.org">
| > | > <datas>
| > | > <data id="1">
| > | > <item>fsfdsfs</item>
| > | > </data>
| > | > <data id="2">
| > | > <item>fksfjkdsjfdks</item>
| > | > </data>
| > | > <PayPerference
| > xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
| > | >
| >
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
| > | >
| >
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
| > | > %3Dnull" xsi:type="a4:Customer+CustomerPayOptions"
| > | > xmlns="">cash</PayPerference>
| > | > </datas>
| > | > </root>
| > | > ============================
| > | >
| > | > Also, you can find the the "PayPerference" element in the output
has
| > an
| > | > empty default namespace
| > | >
| > | > xmlns=""
| > | >
| > | > you can explicitly specify the default namespace by changing the
| > | > XmlElement's construction to below:
| > | >
| > | > XmlElement elm =
| > | > doc.CreateElement("PayPerference","http://www.mycustomapp.com");
| > | >
| > | > Hope helps. Thanks,
| > | >
| > | > Steven Cheng
| > | > Microsoft Online Support
| > | >
| > | > Get Secure! www.microsoft.com/security
| > | > (This posting is provided "AS IS", with no warranties, and confers
no
| > | > rights.)
| > | >
| > | >
| > | >
| > | >
| > | >
| > | > --------------------
| > | > | From: "Paul" <pa*****@community.nospam>
| > | > | Subject: Add XmlNode
| > | > | Date: Wed, 26 Oct 2005 11:29:29 -0700
| > | > | Lines: 28
| > | > | X-Priority: 3
| > | > | X-MSMail-Priority: Normal
| > | > | X-Newsreader: Microsoft Outlook Express 6.00.2900.2180
| > | > | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180
| > | > | X-RFC2646: Format=Flowed; Original
| > | > | Message-ID: <uh*************@TK2MSFTNGP15.phx.gbl>
| > | > | Newsgroups: microsoft.public.dotnet.xml
| > | > | NNTP-Posting-Host: 66.236.123.34.ptr.us.xo.net 66.236.123.34
| > | > | Path:
| > TK2MSFTNGXA01.phx.gbl!TK2MSFTNGP08.phx.gbl!TK2MSFT NGP15.phx.gbl
| > | > | Xref: TK2MSFTNGXA01.phx.gbl microsoft.public.dotnet.xml:9085
| > | > | X-Tomcat-NG: microsoft.public.dotnet.xml
| > | > |
| > | > | Here I have the definition of an XmlNode which is a property
| > | > (PayPreference)
| > | > | on my Customer class containing an enum describing how the
customer
| > will
| > | > | pay.
| > | > |
| > | > | <PayPerference xsi:type="a4:Customer+CustomerPayOptions"
| > | > |
| > | >
| >
xmlns:a4="http://schemas.microsoft.com/clr/nsassem/OsfDomain.Resources.Stage
| > | >
| >
/OsfDomain%2C%20Version%3D1.0.0.1%2C%20Culture%3Dne utral%2C%20PublicKeyToken
| > | > %3Dnull">cash</PayPerference>
| > | > |
| > | > | I now want to add this XmlNode to a different Xml file where the
| > | > Customer
| > | > | class has not defined a PayPreference property. I get as far as
| > | > locating
| > | > | the parent XmlNode (Customer). Now I just need to add the XmlNode
| > | > defined
| > | > | above. To do this, I understand that I need to ask the
XmlDocument
| > to
| > | > | create the node first before I ask the Customer node to
| > 'AppendChild'.
| > | > I
| > | > | notice 3 overloads of CreateElement on the XmlDocument to do this:
| > | > |
| > | > | CreateElement(string name)
| > | > | CreateElement(string qualifiedName, string namespaceURI)
| > | > | CreateElement(string prefix, string localName, string
| > namespaceURI)
| > | > |
| > | > | So now I'm stuck as to what I need to do now. Any help would be
| > | > | appreciated!
| > | > |
| > | > |
| > | > |
| > | > |
| > | > |
| > | > |
| > | > |
| > | > |
| > | > |
| > | >
| > |
| > |
| > |
| >
|
|
|

Nov 12 '05 #6

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

9 posts views Thread by JJ | last post: by
3 posts views Thread by Mahesh Devjibhai Dhola | last post: by
1 post views Thread by andrej | last post: by
5 posts views Thread by Mahesh Devjibhai Dhola | last post: by
1 post views Thread by PaulF | last post: by
3 posts views Thread by Earl | last post: by
5 posts views Thread by =?Utf-8?B?VGhlIE1hbiBGcm9tIFNRTA==?= | last post: by
2 posts views Thread by =?iso-8859-1?Q?Norbert_P=FCrringer?= | last post: by
reply views Thread by leo001 | last post: by

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.