Используя .Net XmlSerializer, есть ли способ пропустить тег корневого уровня? - PullRequest
1 голос
/ 14 апреля 2011

Мне нужно сериализовать некоторые XML в соответствии со спецификацией веб-сервиса. По некоторым причинам я создал несколько разных классов для инкапсуляции информации для моего приложения. Эти классы не соответствуют напрямую XML-схеме. Смотри ниже.

<TopLevel>
    <InfoString>Value</InfoString>
    <InfoInt>242</InfoInt>
    <Etcetera>Value2</Etcetera>
</TopLevel

Пока мои занятия что-то типа:

public class Info
    -InfoString
    -InfoInt
public class Etcetera
    -EtceteraValue

Это дает неправильный Xml, так как есть элемент Info, содержащий InfoStrings, а элемент Etcetera содержит EtceteraValue.

Я реализую IXmlSerializable, но XmlSerializable все еще записывает корневой уровень моих классов. Есть идеи?

Для ясности: я пытаюсь сериализовать несколько классов в один документ на одном уровне.

Ответы [ 4 ]

3 голосов
/ 14 апреля 2011

Я не верю, что это возможно, так как таким образом сериализатор может производить xml, который не может быть однозначно десериализован , если более одного класса имеют атрибут с одним и тем же именем.

Либо вы делаете сериализацию полностью самостоятельно или используете XSLT для преобразования вывода в нужный вам формат xml.

В прошлом я создавал Transfer-классы , которые имеют правильную структуру для сериализации именно в тот формат, который я хочу.Вам нужно только заполнить значения из вашего исходного объекта в объект переноса.

РЕДАКТИРОВАТЬ Другая идея:

Вы можете запросить все данные в формате, который вы хотите отваш объект, используя выражение LINQ.После этого вы можете использовать LINQ to XML для сериализации результата в xml.Я никогда не делал этого раньше, если вам повезет с этим, пожалуйста, дайте мне знать.

1 голос
/ 14 апреля 2011

Если вам нужен точный контроль над выводом xml и объединение совершенно отдельных классов объектов в единый XML-файл, структурированный по-другому, вы можете подумать о том, чтобы записать свой XML-файл вручную, используя XmlWriter, XDocument или XmlDocument.

Я не знаю, как объединить эти классы, используя простые атрибуты для управления сериализацией.

0 голосов
/ 14 апреля 2011

Либо ты:

  1. Свести классы так, чтобы сериализация соответствовала желаемой схеме.
  2. Создайте новый плоский класс и используйте некоторую инфраструктуру сопоставления для сопоставления между вашими структурированными классами и классом с плоской последовательностью, например Value Injecter
  3. Не изменяйте определения типов, а попробуйте изменить XML с помощью XSLT
0 голосов
/ 14 апреля 2011
   public class RootClass
    {
        public Info info { get; set; }
        public Etcetera etc { get; set; }
    }

    public class Info
    {
        [XmlElement]
        public string InfoStr { get; set; }
        [XmlElement]
        public int InfoInt { get; set; }
    }

    public class Etcetera
    {
        [XmlElement]
        public string EtceteraValue { get; set; }
    }

А затем сериализовать RootClass

Это даст вам:

<?xml version="1.0"?>
<RootClass xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<info>
  <InfoStr>asdf</InfoStr>
  <InfoInt>1</InfoInt>
</info>
<etc>
  <EtceteraValue>etc</EtceteraValue>
</etc>

...