Обобщение и типизированный XML в.NET?

Я работаю с некоторыми XML-представлениями экземпляров данных. Я десериализирую объекты, используя сериализацию.NET, но что-то в моей душе беспокоит необходимость писать классы для представления XML... Ниже я хотел бы сделать то, что ЛЮБЛЮ, но не знаю, синтаксис ли это или нет возможно даже:

Учтите следующее:

dim xmlObject = SomeXMLFunction() 'where some function returns an object/string representation of xml...

xmlObject.SomePropertyDefinedInTheXML = SomeFunction()

Любые предложения о подходах с этим?

4 ответа

Решение

VB.NET позволяет работать с XML довольно интуитивно понятным способом:

Sub Serialize()
    Dim xml = <myData>
                  <someValue><%= someFunction() %></someValue>
              </myData>
    xml.Save("somefile.xml")
End Sub

Sub Serialize2()   ' if you get the XML skeleton as a string
    Dim xml = XDocument.Parse("<myData><someValue></someValue></myData>")
    xml.<myData>.<someValue>.Value = "test"
    xml.Save("somefile.xml")
End Sub

Sub Deserialize()
    Dim xml = XDocument.Load("somefile.xml")

    Dim value = xml.<myData>.<someValue>.Value
    ...
End Sub

Недостаток: у вас нет сильной печати здесь; Value Свойство всегда возвращает строку.

Иди и получи xsd.exe. Это создаст правильные классы сериализации XML из вашего определения схемы. Автоматически!

Если вы управляете определением XML (то есть XSD), то на самом деле хорошей идеей является написание классов, представляющих XML (они называются DTO). Он дает вам строго типизированный класс для кодирования, и вы получаете бесплатную десериализацию без необходимости выполнять ручной, подверженный ошибкам синтаксический анализ xml самостоятельно. Если это так, напишите сначала классы, например

[DataContract]
public class Book
{
  [DataMember]
  public string Name {get;set;}

  [DataMember]
  public string Author {get;set;}
}
//Then you can use this code to serialize
var xml = DataContractSerializer.Instance.SerializeToString(
  new Book {Name="A", Artist="B"});

//which will give you something like:
<Book>
<Name>A</Name>
<Author>B</Author>
</Book>
//You can then [Deserialize][2] it back again with:
var book = DataContractDeserializer.Instance.Parse<Book>(xml);

Вот ссылки на классы Serializer и Deserializer.

Если у вас есть WSDL или XSD, вы можете использовать wsdl.exe (или Добавить ссылку на службу в VS.NET) или xsd.exe, чтобы сгенерировать классы dto для вас, как предложено @DavidSchmitt.

В качестве альтернативы, если XSD недоступен, я рекомендую вам взглянуть на XLinq для еще одного простого способа анализа XML.

То, что вы спрашиваете при утечной типизации, - это свободная типизация, а.net - это, безусловно, статическая типизация, по крайней мере, до версии 3.5.

если вы идете по пути такого рода и набираете тип освобождения:classical frameworks => prototyping frameworks => duck typing,

В js, очевидно, вы можете достичь почти всего этого, но в C# или vb.net вы окажетесь в классическом и бюрократическом отношении к типам.

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

Если это обязательно необходимо, у вас есть два пути (с отражением):

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

  • Вы можете следовать по самому болезненному пути и использовать отражение.emit для прямого создания шрифта в CLR, что может дать вам множество преимуществ. Это может оказаться болезненным, если сделать это.

Если вы найдете способ, пожалуйста, я хотел бы услышать об этом, потому что печатать на утке это здорово. И хвалить независимых и смелых людей.

Удачи тебе

Другие вопросы по тегам