Как получить простые классы c # из простого XML?

#c# #xml

#c# #xml

Вопрос:

Я гоняюсь за своим хвостом с xsd.exe csxsd.exe и svcutil. Должно быть, я упускаю что-то основное. Мне просто нужны базовые объекты с базовыми свойствами и списками или []. Чего мне не хватает?

XSD, который я получаю, слишком сложный, и объекты не включают списки или массивы.

Спасибо,

Комментарии:

1. Итак, вы начинаете с XML-файла? И я так понимаю, вы генерируете XSD на основе его содержимого, а затем используете xsd.exe для генерации классов C #? Если да, не могли бы вы уделить время разметке XSD так, как вы хотите? При нескольких уровнях генерации кода неудивительно, что вы получаете … интересные … результаты.

2. итак… Я использовал xsd.exe сгенерировать xsd, но следующий шаг, генерирующий классы, приводит к чему-то далекому от простого класса c # со свойствами, представляющими коллекции дочерних объектов, как в xml

Ответ №1:

Для использования вам понадобится .xsd (файл схемы) xsd.exe /classes . Если у вас нет файла .xsd, вы можете сгенерировать его с помощью инструмента, подобного этому. Большинство инструментов принимают string за тип данных, и вы можете изменить сгенерированную схему, если она вам не нравится.

Ответ №2:

Зачем создавать класс, соответствующий XML, с которым вам приходится иметь дело, и помечать его атрибутами сериализации XML, чтобы управлять его сериализацией. Это [может быть] так же просто, как:

 using System.IO;
using System.Xml.Serialization;

namespace AnXmlSample
{

  class Program
  {
    static void Main( string[] args )
    {
      string xml = @"<document id='3'>
                       <name>
                         document name
                       </name>
                       <foo widget-id='12' >
                         The quick brown fox jumped over the lazy dog
                       </foo>
                     </document>" ;
      StringReader sr = new StringReader(xml) ;
      XmlSerializer serializer = new XmlSerializer(typeof(MyDataFromXml)) ;
      MyDataFromXml instance = (MyDataFromXml) serializer.Deserialize( sr ) ;

      return ;
    }
  }

  [XmlRoot("document")]
  public class MyDataFromXml
  {
    [XmlAttribute("id")]
    public int Id { get ; set ; }

    [XmlElement("name")]
    public string Name { get ; set ; }

    [XmlElement("foo")]
    public Widget Foo { get ; set ; }

  }

  public class Widget
  {
    [XmlAttribute("widget-id")]
    public int id { get ; set ; }

    [XmlText]
    public string Content { get ; set ; }
  }

}
  

Комментарии:

1. По моему опыту, когда я смотрю на код, сгенерированный xsd.exe , «простой» — это не то прилагательное, которое обычно приходит на ум.