Как десериализовать XML-документ с пространствами имен с помощью XmlSerializer? - PullRequest
3 голосов
/ 17 октября 2011

При десериализации документа с использованием XmlSerializer не десериализованы правильно

Документ

<?xml version=\"1.0\"?>
<ns0:ElementA xmlns:ns0=\"urn:some-namespace\">
    <Prop1>Some Value</Prop1>
    <Prop2>Some other value</Prop2>
</ns0:ElementA>

Класс

[XmlRoot(Namespace = "urn:some-namespace")]
public class ElementA
{
    [XmlElement]
    public string Prop1 { get; set; }

    [XmlElement]
    public string Prop2 { get; set; }
}

И Prop1, и Prop2 равны нулю в концедесериализация.

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

Документ был упрощен с целью воспроизведения

Как установить атрибуты в ElementA для правильной обработки десериализации ??

- Вот полный код для воспроизведения проблемы -

namespace ConsoleApplication1
{
    using System;
    using System.IO;
    using System.Xml.Serialization;

    public class Program
    {
        [XmlRoot(Namespace = "urn:some-namespace")]
        public class ElementA
        {
            [XmlElement]
            public string Prop1 { get; set; }

            [XmlElement]
            public string Prop2 { get; set; }
        }

        static void Main(string[] args)
        {
            var element =
                "<?xml version=\"1.0\"?>" + Environment.NewLine +
                "<ns0:ElementA xmlns:ns0=\"urn:some-namespace\">" + Environment.NewLine+                    "    <Prop1>Some Value</Prop1>" + Environment.NewLine +
                "    <Prop2>Some other value</Prop2>" + Environment.NewLine +
                "</ns0:ElementA>";

            XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(ElementA) })[0];
            ElementA result;

            using (var reader = new StringReader(element))
            {
                result = serializer.Deserialize(reader) as ElementA;
            }

            Console.WriteLine("Prop1: " + result.Prop1);
            Console.WriteLine("Prop2: " + result.Prop2);
            Console.ReadKey();
        }
    }
}

1 Ответ

13 голосов
/ 17 октября 2011

Первоначально опубликовано в качестве комментария, так как я не проверил его, но:

<Prop1>Some Value</Prop1>

- это не то же самое, что

<ns0:Prop1>Some Value</ns0:Prop1>

Так что, чтобы заставить его работать, вы, вероятно,просто нужно:

[XmlElement(Namespace="")]
public string Prop1 { get; set; }

[XmlElement(Namespace="")]
public string Prop2 { get; set; }
...