简体   繁体   中英

C# Object Serialization to XML namespace and prefix in child element only

How to get a namespace set at a child level element when serializing an object to XML with C#?

The XML I want to end up with this as the XML output:

<clsPerson>
  <FirstName>Jeff</FirstName>
  <MI>J</MI>
  <LastName>Jefferson</LastName>
  <ns1:Addresses xmlns="www.whatever.co.uk">
    <Home>Here</Home>
    <Work>There</Work>
  </Addresses>
</clsPerson>

The code I'm using is mostly taken from other questions, and is as follows:

using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

public class clsPerson
{
   public string FirstName;
   public string MI;
   public string LastName;

   [XmlElement(Namespace = "www.whatever.co.uk")]
   public clsPlaces Addresses; 

       public clsPerson()
       {
         clsPlaces clsPlaces = new clsPlaces();
       }
 }

[XmlRoot(Namespace = "")]
public class clsPlaces
{
public string Home { get; set; }
public string Work { get; set; }
   }

class class1
{
 static void Main(string[] args)
{
    clsPerson p = new clsPerson();
    var xml = "";
    p.FirstName = "Jeff";
    p.MI = "J";
    p.LastName = "Jefefrson";
    p.Addresses = new clsPlaces();
    p.Addresses.Home = "Here";
    p.Addresses.Work = "There";

    var emptyNamepsaces = new XmlSerializerNamespaces(new[] {       XmlQualifiedName.Empty });
    var serializer = new XmlSerializer(p.GetType());
    var settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;

   emptyNamepsaces.Add("ns", "www.whatever.co.uk");

    using (var stream = new StringWriter())
    using (var writer = XmlWriter.Create(stream, settings))
    {
        serializer.Serialize(writer, p, emptyNamepsaces);
        xml =  stream.ToString();
    }

       Console.WriteLine(xml)
       Console.ReadLine();
    }
}

The above gives:

<clsPerson xmlns:ns="www.whatever.co.uk">
  <FirstName>Jeff</FirstName>
  <MI>J</MI>
  <LastName>Jefefrson</LastName>
  <ns:Addresses>
    <Home>Here</Home>
    <Work>There</Work>
  </ns:Addresses>

How would I get the xmlns on the element only? I have tried everything I can see search stackoverflow, and not been able to find/understand the answer.

Thanks

Remove this - adding the namespace will ensure the prefix gets added to the root:

emptyNamepsaces.Add("ns", "www.whatever.co.uk");

The declaration for addresses will get added automatically. You also need to remove the empty namespace from clsPlaces , else the namspaces for Home and Work will be incorrect:

public class clsPlaces
{
    public string Home { get; set; }
    public string Work { get; set; }
}

The output will then look like this:

<clsPerson>
  <FirstName>Jeff</FirstName>
  <MI>J</MI>
  <LastName>Jefefrson</LastName>
  <Addresses xmlns="www.whatever.co.uk">
    <Home>Here</Home>
    <Work>There</Work>
  </Addresses>
</clsPerson>

See this fiddle for a demo.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM