XML-сериализация .net: как указать корневой элемент массива и имена дочерних элементов - PullRequest
5 голосов
/ 19 марта 2010

Рассмотрим следующие сериализуемые классы:

class Item {...}
class Items : List<Item> {...}
class MyClass
{
   public string Name {get;set;}
   public Items MyItems {get;set;}
}

Я хочу, чтобы сериализованный вывод был похож на:

<MyClass>
    <Name>string</Name>
    <ItemValues>
        <ItemValue></ItemValue>
        <ItemValue></ItemValue>
        <ItemValue></ItemValue>
    </ItemValues>
</MyClass>

Обратите внимание, что имена элементов ItemValues ​​и ItemValue не совпадают с именами классов Item и Items, при условии, что я не могу изменить класс Item или Items, есть ли смысл указывать имена элементов, которые я хочу, путем изменения класса MyClass

Ответы [ 3 ]

6 голосов
/ 19 марта 2010
public class MyClass
{
    public string Name {get;set;}
    [XmlArray("ItemValues")]
    [XmlArrayItem("ItemValue")]
    public Items MyItems {get;set;}
}
1 голос
/ 19 марта 2010

Возможно, вы захотите посмотреть " Как: указать альтернативное имя элемента для потока XML "

В этой статье обсуждается использование XmlElementAttribute ElementName для достижения этой цели.

0 голосов
/ 20 марта 2010

Вы также можете рассмотреть возможность использования Linq to Xml для создания вашего XML из вашего класса. Что-то вроде

XElement element = new XElement(
    "MyClass",
    new XElement("Name", myClass.Name),
    new XElement(
        "ItemValues",
        from item in myClass.Items
        select new XElement(
            "ItemValue",
            new XElement("Foo", item.Foo))));

Что бы создать

<MyClass>
  <Name>Blah</Name>
  <ItemValues>
    <ItemValue>
      <Foo>A</Foo>
    </ItemValue>
    <ItemValue>
      <Foo>B</Foo>
    </ItemValue>
  </ItemValues>
</MyClass>
...