XML-сериализация, где элемент запроса заключен в несколько родительских элементов

1

У меня есть класс запроса баланса торгового счета следующим образом:

[Serializable]
[XmlRoot(ElementName = "accountbalance", Namespace = "", IsNullable = false)]
public class MerchantAccountBalanceRequest
{
    [XmlElementAttribute("agent")]
    public string Agent { get; set; }
    [XmlElementAttribute("agentPin")]
    public string AgentPin { get; set; }
}

Это приведет к следующему XML:

<accountbalance>
    <agent>aaaaaa</agent>
    <agentPin>mmmmmm</agentPin>
</accountbalance>

Могу ли я каким-то образом добавить атрибут в свой класс, чтобы для объекта MerchantAccountBalanceRequest я получил следующий XML:

<Envelope>
<Body>
<accountbalance>
    <agent>aaaaaa</agent>
    <agentPin>mmmmmm</agentPin>
</accountbalance>
</Body>
</Envelope>

То есть, просто оберните его элементами Envelope и Body.

Теги:
xml-serialization
xml-deserialization

1 ответ

1
Лучший ответ

Пока вы не можете достичь этого с помощью атрибута в своем классе запроса, вы можете обернуть свой запрос в другие классы, представляющие элементы Envelope и Body:

public class MerchantAccountBalanceRequest
{
    [XmlElement("agent")]
    public string Agent { get; set; }
    [XmlElement("agentPin")]
    public string AgentPin { get; set; }
}

public class RequestBody
{
    [XmlElement("accountbalance")]
    public MerchantAccountBalanceRequest BalanceRequest { get; set; }
}

[XmlRoot(ElementName = "Envelope")]
public class RequestEnvelope
{
    [XmlElement("Body")]
    public RequestBody Body { get; set; }
}

При сериализации и десериализации создайте объект XmlSerializer из RequestEnvelope вместо MerchantAccountBalanceRequest. При их создании вам необходимо будет установить свойства RequestEnvelope.Body и RequestBody.BalanceRequest (для удобства вы могли бы инициализировать свойство Body в RequestEnvelope для нового экземпляра RequestBody в конструкторе).

Это похоже на один тип запроса в каком-то протоколе, поэтому, если у вас несколько типов запросов, вы можете создать базовый класс для запросов (например, RequestBase) и настроить RequestBody так, чтобы он принял выбор возможных элементов запроса, таких как в следующем примере:

public abstract class RequestBase
{
}

public class SomeOtherRequest : RequestBase
{
    [XmlElementAttribute("example")]
    public string Example { get; set; }
}

public class MerchantAccountBalanceRequest : RequestBase
{
    [XmlElement("agent")]
    public string Agent { get; set; }
    [XmlElement("agentPin")]
    public string AgentPin { get; set; }
}

public class RequestBody
{
    [XmlElement(ElementName = "accountbalance", Type = typeof(MerchantAccountBalanceRequest))]
    [XmlElement(ElementName = "somethingelse", Type = typeof(SomeOtherRequest))]
    public RequestBase Request { get; set; }
}
  • 0
    Я думал о наследовании, но забыл об абстрактном классе. Большое спасибо Дэвид
  • 1
    Нет проблем :-) Но откуда вы знаете мое имя: -o
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню