Повторяющиеся значения при десериализации XML из внешнего API с использованием встроенной десериализации XML в C # - PullRequest
0 голосов
/ 04 мая 2011

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

ПРИМЕЧАНИЕ: я не могу контролировать xml, это внешний API

Проблема в том, что узел xml был расширен, чтобы включить дочерний узел с тем же именем, и он нарушает сериализацию.

Например, xml выглядит следующим образом:

<people>
  <person>
    <id>1234</id>
    <person>
      <name>This is my name</name>
    <person>
   </person>
</people>

Со следующими объектами

[XmlType("person")]
public class Person {

  [XmlElement("id")]
  public int Id { get; set; }

  [XmlElement("person")]
  public PersonTitle Title{ get; set; }
}

[XmlType("person")]
pulic class PersonTitle
{
   [XmlElement("name")]
   public string Name { get; set; }
}

Выдает ошибку при вызове (T) xmlserializer.Deserialize (stream) из-за повторяющихся имен, даже если xml действителен. Лично я бы не стал копировать макет xml в объектах, просто чтобы автоматически десериализовать его, когда десериализацию вручную поддерживать проще (особенно, если она никогда не сериализуется с помощью .net, во-первых).

Однако я хотел бы знать, есть ли способ обойти это, даже если это означает выравнивание дочернего объекта.

Я знаю, что это не работает, но как пример:

[XmlType("person")]
public class Person {

  [XmlElement("id")]
  public int Id { get; set; }

  [XmlElement("person/name")]
  public string Title{ get; set; }
}

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Самым простым способом может быть запуск его через XSLT-преобразование перед его десериализацией - сопоставление элементов person / person / name и вывод только части person / name.Затем десериализуйте результат.

Вот SO-сообщение о применении XSLT в C #: Как применить таблицу стилей XSLT в C #

А вот об использовании XSLT для заменыэлементы: http://cvalcarcel.wordpress.com/2008/09/06/replacing-arbitrary-xml-located-within-an-xml-document-using-xslt/

0 голосов
/ 04 мая 2011

В худшем случае вы можете написать класс так, как вам нравится (не идите на компромисс из-за сериализации), а затем реализовать IXmlSerializable.Реализуйте ReadXml, бросьте NotImplementedException для WriteXml, если хотите.

...