Как переименовать дочерние элементы XML, используемые в сериализованном списке XML <string>? - PullRequest
2 голосов
/ 26 ноября 2008

Я сериализую в XML мой класс, где одно из свойств имеет тип List .

public class MyClass {
    ...
    public List<string> Properties { get; set; }
    ...
}

XML, созданный сериализацией этого класса, выглядит следующим образом:

<MyClass>
    ...
    <Properties>
        <string>somethinghere</string>
        <string>somethinghere</string>
    </Properties>
    ...
</MyClass>

а теперь мой вопрос. Как я могу изменить свой класс для достижения XML следующим образом:

<MyClass>
    ...
    <Properties>
        <Property>somethinghere</Property>
        <Property>somethinghere</Property>
    </Properties>
    ...
</MyClass>

после сериализации. Спасибо за любую помощь!

Ответы [ 3 ]

7 голосов
/ 26 ноября 2008

Попробуйте XmlArrayItemAttribute :

using System;
using System.IO;
using System.Xml.Serialization;
using System.Collections.Generic;

public class Program
{
    [XmlArrayItem("Property")]
    public List<string> Properties = new List<string>();

    public static void Main(string[] args)
    {
        Program program = new Program();
        program.Properties.Add("test1");
        program.Properties.Add("test2");
        program.Properties.Add("test3");

        XmlSerializer xser = new XmlSerializer(typeof(Program));
        xser.Serialize(new FileStream("test.xml", FileMode.Create), program);
    }
}

test.xml:

<?xml version="1.0"?>
<Program xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Properties>
    <Property>test1</Property>
    <Property>test2</Property>
    <Property>test3</Property>
  </Properties>
</Program>
0 голосов
/ 31 мая 2010

Если вы хотите сделать это в службе WCF и по-прежнему использовать DataContractSerializer, вы можете просто определить новый подкласс List:

[CollectionDataContract(ItemName="Property")]
public class PropertyList: List<string>
{
    public PropertyList() { }
    public PropertyList(IEnumerable<string> source) : base(source) { }
}

Затем в сериализуемом классе просто укажите член как:

[DataMember]
public PropertyList Properties;
0 голосов
/ 26 ноября 2008

Добавьте [XmlElement("Property")] до объявления вашего члена Properties.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...