Какой элегантный и простой способ создать XML из пользовательского объекта? - PullRequest
1 голос
/ 20 декабря 2009

Мне нужно построить транзакцию XML следующего формата:

<RateV3Request USERID="MyId">
    <Package ID="1ST">
        <Service>ALL</Service>
        <FirstClassMailType>LETTER</FirstClassMailType>
        <ZipOrigination>06226</ZipOrigination>
        <ZipDestination>06231</ZipDestination>
        <Pounds>0</Pounds>
        <Ounces>4.5</Ounces>
        <Size>REGULAR</Size>
        <Machinable>true</Machinable>
    <ShipDate Option="EMSH">21-Dec-2009</ShipDate> 
    </Package>
</RateV3Request>

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

Я думал о создании функции «GetXml» для моего объекта, которая возвращает XML-представление значений в экземпляре объекта. Я мог бы выполнить всю конкатенацию строк самостоятельно, но наверняка есть более чистый способ.

Предложения? Я использую VB.NET

Ответы [ 4 ]

2 голосов
/ 20 декабря 2009

XmlSerializer должен сделать эту работу за вас. Вы можете использовать атрибуты XML для управления тем, как ваши свойства и поля должны быть сериализованы в XML (например, как атрибут, как отдельный элемент, а не как ...) 1007 *

Например, ваш класс Package может выглядеть так (не проверено):

Public Class Package

    <XmlAttribute("ID")> _
    Public Property ID As String
        ...
    End Property

    Public Service As String

    ...

End Class

Тогда вы можете сделать что-то вроде этого (не проверено):

Dim packageSerializer As New XmlSerializer(GetType(Package))
Dim writer As New StringWriter()
packageSerializer.Serialize(writer, myPackage)
Console.WriteLine(writer.ToString())
1 голос
/ 21 декабря 2009

Два варианта, которые стоит рассмотреть при создании XML:

  1. Сериализация - встроена, и при необходимости вы получаете некоторый контроль над тем, как именно работает сериализатор.

  2. Материал для рукоделия (и это не обязательно плохой вариант, поскольку он позволяет вам производить точно , что вы хотите), а затем вы хотите работать с Linq в XML - есть некоторые действительно умные вещи в VB.NET, чтобы сделать это почти декларативным (хотя я не играл, поскольку мой язык выбора в настоящее время - C #).

Учитывая ваше основное требование - создание XML для передачи в другое приложение, я, вероятно, с большей вероятностью соглашаюсь с Hand Crafted, учитывая, насколько просто создавать с использованием различных конструкций Linq to XML.

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

1 голос
/ 20 декабря 2009

Терминология XML:

В XML у вас есть элементы и атрибуты . В вашем примере ZipOrigination является элементом - он содержит открывающий и закрывающий тег. USERID является атрибутом - он появляется в открывающем теге элемента и имеет имя и значение (в кавычках).

.NET Framework классы

Для вашей конкретной проблемы вы можете использовать XDocument (http://msdn.microsoft.com/en-us/library/system.xml.linq.xdocument.aspx) или XmlDocument (http://msdn.microsoft.com/en-us/library/system.xml.xmldocument.aspx). XDocument - более новое дополнение к .NET framework), и для многих задач это предпочтительный выбор. См. эту ветку, например: http://social.msdn.microsoft.com/forums/en-US/xmlandnetfx/thread/4895ba4d-0425-4d10-9bae-5c33e8385357.

Пользовательские классы

Похоже, вы захотите написать класс RateV3Request, который содержит свойства UserId и Package. Похоже, что другой класс ShipDate со свойством Option может быть полезен. Затем, наконец, вы можете написать класс Package, который содержит все остальные свойства (Id, Service, FirstClassMailType, ..., ShipDate). Каждое свойство должно иметь соответствующий тип данных.

Собираем все вместе

Вы можете либо добавить GetXml() метод для каждого из ваших пользовательских классов, либо написать отдельный класс (например, RateV3RequestGateway), который обрабатывает все преобразования между вашими классами и XML. Я предпочитаю специализированный класс, потому что он обеспечивает большую гибкость. Если позже вы захотите использовать базу данных или JSON вместо XML, вы можете написать другой шлюз, но вам не придется трогать ваши пользовательские классы.

0 голосов
/ 20 декабря 2009

Большинство современных языков ООП, поддерживающих XML, будут иметь сериализованную библиотеку, которая будет обрабатывать такие вещи для вас.

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

Для .NET вы можете посмотреть пространство имен serialization .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...