Сериализация XML со странными пространствами имен? - PullRequest
3 голосов
/ 14 июля 2011

Вопрос: Как выглядит класс для сериализации этого содержимого XML?

<?xml version="1.0" encoding="utf-8"?>
<vcc:CreateTextSearchResponse xmlns:vcc="urn:veloconnect:catalog-1.1" xmlns:vct="urn:veloconnect:transaction-1.0">
  <vct:BuyersID>12345</vct:BuyersID>
  <vct:ResponseCode>200</vct:ResponseCode>
  <vct:TransactionID>225</vct:TransactionID>
  <vct:StatusCode>2</vct:StatusCode>
  <vct:IsTest>false</vct:IsTest>
  <vcc:TotalCount>3876</vcc:TotalCount>
</vcc:CreateTextSearchResponse>

Если я разрешу запустить его через xsd.exe, он выдаст ошибку.

У меня нет проблем с генерацией:

<?xml version="1.0" encoding="utf-8"?>
<CreateTextSearchResponse>
  <BuyersID>15942</BuyersID>
  <ResponseCode>200</ResponseCode>
  <TransactionID>225</TransactionID>
  <StatusCode>2</StatusCode>
  <IsTest>false</IsTest>
  <TotalCount>3876</TotalCount>
</CreateTextSearchResponse>

Просто мне нужны эти пространства имен, чтобы десериализовать его (а затем и повторно сериализовать), поэтому я не могу просто оставить его таким (он нужен стороннему веб-сервису) ...

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

Как это:

[XmlRoot(Namespace = CreateTextSearchResponse.CatalogNamespace)]
public class CreateTextSearchResponse
{
    public const string CatalogNamespace = "urn:veloconnect:catalog-1.1",
                TransactionNamespace = "urn:veloconnect:transaction-1.0";
    [XmlElement(Namespace=TransactionNamespace)]
    public int BuyersId { get; set; }
    [XmlElement(Namespace = TransactionNamespace)]
    public int ResponseCode { get; set; }
    [XmlElement(Namespace = TransactionNamespace)]
    public int TransactionID { get; set; }
    [XmlElement(Namespace = TransactionNamespace)]
    public int StatusCode { get; set; }
    [XmlElement(Namespace = TransactionNamespace)]
    public bool IsTest { get; set; }
    [XmlElement(Namespace = CatalogNamespace)]
    public int TotalCount { get; set; }
}

public static void Main()
{
    var ser = new XmlSerializer(typeof(CreateTextSearchResponse));
    var obj = new CreateTextSearchResponse
    {
        BuyersId = 12345,
        ResponseCode = 200,
        TransactionID = 225,
        StatusCode = 2,
        IsTest = false,
        TotalCount = 3876
    };
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("vcc", CreateTextSearchResponse.CatalogNamespace);
    ns.Add("vct", CreateTextSearchResponse.TransactionNamespace);
    ser.Serialize(Console.Out, obj, ns);
}
0 голосов
/ 14 июля 2011

к сожалению, в вашем именном пространстве есть специальные символы, которые Xml не может обработать

...