Как настроить вывод сериализации XML для объекта?

У меня есть настраиваемый класс объектов, который я хотел бы сериализовать:

public partial class CustomObject
{               
    public List<CustomProperty> Properties;
}

public class CustomProperty
{              
    public object Value;                
    [XmlAttribute]
    public string Name;
}

// some class to be used as a value for CustomProperty
public class Person
{
  public string Name;
  public string Surname;
  public string Photo;
  [XmlAttribute]
  public int Age;
}

В настоящее время вывод XML-сериализации выглядит следующим образом:

<CustomObject>
  <Properties>
    <CustomProperty Name="Employer">
      <Value p6:type="Person" xmlns:p6="http://www.w3.org/2001/XMLSchema-instance" Age="30">
        <Name>John</Name>
        <Surname>Doe</Surname>
        <Photo>photos/John.jpg</Photo>
      </Value>
    </CustomProperty>
    <CustomProperty Name="Desc">
      <Value xmlns:q1="http://www.w3.org/2001/XMLSchema" p7:type="q1:string" xmlns:p7="http://www.w3.org/2001/XMLSchema-instance">some text</Value>
    </CustomProperty>
  </Properties>
</CustomObject>

Прежде всего, я хотел бы удалить пространства имен и весь этот шум.

Конечный результат должен выглядеть так:

<CustomObject>
  <Properties>
    <CustomProperty Name="Employer">
      <Person Age="30">
        <Name>John</Name>
        <Surname>Doe</Surname>
        <Photo>photos/John.jpg</Photo>
      </Person>
    </CustomProperty>
    <CustomProperty Name="Desc">
      <string>some text</string>
    </CustomProperty>
  </Properties>
</CustomObject>

Или это:

<CustomObject>
  <Properties>
    <Person Name="Employer" Age="30">
      <Name>John</Name>
      <Surname>Doe</Surname>
      <Photo>photos/John.jpg</Photo>
    </Person>
    <string Name="Desc">
      some text
    </string>
  </Properties>
</CustomObject>

Как заставить XmlSerializer выводить его таким образом?


person JBeurer    schedule 15.09.2010    source источник


Ответы (3)


Вы также можете указать имя элемента, чтобы убедиться, что типы обрабатываются правильно:

[System.Xml.Serialization.XmlElementAttribute("files", typeof(Files))]
[System.Xml.Serialization.XmlElementAttribute("metrics", typeof(Metrics))]
public object[] Items { get; set; }
person Johann Blais    schedule 15.09.2010
comment
Это получает первый желаемый случай. Спасибо! - person JBeurer; 15.09.2010

Посмотрите на атрибут XmlElement — это может решить проблему. ваша проблема хотя бы частично. Из MSDN:

public class Things {
    [XmlElement(DataType = typeof(string)),
    XmlElement(DataType = typeof(int))]
    public object[] StringsAndInts;
 }

будет производить

 <Things>
    <string>Hello</string>
    <int>999</int>
    <string>World</string>
 </Things>
person VinayC    schedule 15.09.2010
comment
Похоже, что MSDN на самом деле имеет ошибку в примере, я думаю, что это должно быть [XmlElement(Type = typeof(string))] [XmlElement(Type = typeof(int))], потому что DataType является строкой. Но это тоже работает! Спасибо! - person JBeurer; 15.09.2010

вы можете удалить пространство имен, например

            StringBuilder sb = new StringBuilder();
            XmlWriter writer = XmlWriter.Create(sb);
            XmlSerializer serializer = new XmlSerializer(typeof(WSOpenShipments), myns);
            var ns = new XmlSerializerNamespaces();
            ns.Add(string.Empty, "");
            serializer.Serialize(writer, OS, ns);
            xmlString = sb.ToString();

используйте это -- ns.Add(string.Empty, "");

person Mou    schedule 09.05.2011