1999-05-31T1...">

How to serialize XML for namespace management?

I need to create the following XML:

<Learner xmlns="some.domain.api"> <ActivationDate>1999-05-31T11:20:00</ActivationDate> <EmailAddress>String content</EmailAddress> <ExpirationDate>1999-05-31T11:20:00</ExpirationDate> <FederalId>String content</FederalId> <FirstName>String content</FirstName> <Grade>K</Grade> <LastName>String content</LastName> <MiddleName>String content</MiddleName> <UserName>String content</UserName> <Password>String content</Password> <SISId>String content</SISId> <StateId>String content</StateId> <Status>Active</Status> </Learner> 

I read the following questions:

I use Xsd2Code to create classes from XSD. It works .

I tried this:

 private static string SerializeXML(Object obj) { XmlSerializer serializer = new XmlSerializer(obj.GetType(), "some.domain.api"); //settings XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.OmitXmlDeclaration = true; StringWriter stream = new StringWriter(); XmlWriter writer = XmlWriter.Create(stream, settings); serializer.Serialize(writer, obj); return stream.ToString(); } 

But he produces this:

 <Learner xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="some.domain.api"> <ActivationDate>1999-05-31T11:20:00</ActivationDate> <EmailAddress>String content</EmailAddress> <ExpirationDate>1999-05-31T11:20:00</ExpirationDate> <FederalId>String content</FederalId> <FirstName>String content</FirstName> <Grade>K</Grade> <LastName>String content</LastName> <MiddleName>String content</MiddleName> <UserName>String content</UserName> <Password>String content</Password> <SISId>String content</SISId> <StateId>String content</StateId> <Status>Active</Status> </Learner> 

I want to get rid of xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" .

How?

Update

I have already tried this using XmlSerializerNamespaces . If I add such namespaces using my implementation above with the necessary settings:

 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("ns","some.domain.api") }); 

I get this:

 <Learner xmlns:ns="some.domain.api"> 

But I need this:

 <Learner xmlns="some.domain.api"> 

If I add such namespaces using my implementation above with the necessary settings:

 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty }); 

I get this:

 <q1:Learner xmlns:ns="some.domain.api"> 

for all XML tags!

Is there any way I can do to get the desired result? I really don't want to use StringBuilder for this task ...

+4
source share
3 answers

You can do the way you did it with

 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("ns","some.domain.api") }); 

and after writing the file do the following:

 StreamReader reader = new StreamReader(file_name); string content = reader.ReadToEnd(); reader.Close(); content = Regex.Replace(content, ":ns", ""); StreamWriter writer = new StreamWriter(file_name); writer.Write(content); writer.Close(); 

Not the most elegant, but it works.

+2
source

The trick is to use an empty name for the namespace:

 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(new[] { new XmlQualifiedName("","some.domain.api") }); 

Then you add them for the serialization process:

 serializer.Serialize(writer, obj, namespaces); 

All to omit "ns:".

+2
source

try something like this:

  public static string SerializeObject(object obj) { XmlSerializerNamespaces XSN = new XmlSerializerNamespaces(); XSN.Add("bs", "some.domain.api"); XmlWriterSettings XWS = new XmlWriterSettings(); XWS.OmitXmlDeclaration = true; Stream stream = new MemoryStream(); XmlTextWriter xtWriter = new XmlTextWriter(stream, new UTF8Encoding(false)); XmlSerializer ser = new XmlSerializer(obj.GetType()); ser.Serialize(xtWriter, obj, XSN); xtWriter.Flush(); stream.Seek(0, System.IO.SeekOrigin.Begin); string xml = Encoding.UTF8.GetString(((MemoryStream)stream).ToArray()); return xml; } 

updated

You can always replace the returned xml string "xmlns: bs" with "xmlns" if you are forced to have fixed xml output syntax!

0
source

All Articles