如何使用XmlSerializer反序列化带命名空间的xml文档?

4
使用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都为null。

我不能改变文档的结构以去除命名空间,因此我需要在我的端上正确处理反序列化。

为了重现问题,该文档已经被简化。

我应该如何设置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();
        }
    }
}

3
随意想法 - 你尝试过在属性上使用[XmlElement(Namespace="")]吗? - Marc Gravell
@Marc,这正是需要做的。你可以将其发布为答案。 - Darin Dimitrov
@Darin - 我当时在使用手机,无法验证,因此我没有将其发布为答案(我喜欢对答案有合理的信心)。顺便说一句,看起来你很快就会超过我了,只剩下几个月了;p - Marc Gravell
@MarcGravell,声望并不重要。真正重要的是回答的质量。而你的回答一直都非常高质量,让许多开发人员受益。 - Darin Dimitrov
1个回答

15

最初作为评论发布,因为我还没有验证它,但是:

<Prop1>Some Value</Prop1>

不同于

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

所以为了让它工作,你可能只需要:

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

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

按照指示工作。我错误地假设将命名空间未设置与将其设置为“”相同。显然,我错了。 - angrifel
2
@Felipe,“not stated”表示“使用成员名称作为元素名称,并从父级继承命名空间”。 - Marc Gravell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接