XML反序列化为xml属性返回null,但返回正确的Xml文本

时间:2017-10-12 16:18:43

标签: c# xml deserialization xml-deserialization

下面我有以下对象:

[XmlRoot("ExampleObject")]
public class ExampleObject
{
    [XmlElement("element1")]
    public long element1{ get; set; }

    [XmlElement("element2")]
    public string element2{ get; set; }

    [XmlElement("element3")]
    public string element3{ get; set; }

    [XmlElement("element4")]
    public ExampleObject2 element4{ get; set; }
}

[Serializable()]
public class ExampleObject2
{
    [XmlText]
    public string Value { get; set; }

    [XmlAttribute]
    public string Id { get; set; }

    [XmlAttribute]
    public string Ref { get; set; }   
}

以及以下XML:

<c:ExampleObject>
   <c:element1>
        ...
   </c:element1>
   <c:element2>
          ...
   </c:element2>
   <c:element3>
          ...
   </c:element3>
   <c:element4 z:Ref="953" i:nil="true"/> <!--- or this <c:Status z:Id="953">...</c:element4> -->
</ExampleObject>

除了element4ExampleObject2我的IdRef为空而Value具有正确性ExampleObject2之外,我能够完全正常使用我的对象里面的价值。

我希望它Value总是有一个Id,它是null或它应该具有的值。我希望Refelement4成为element4内属性的值,具体取决于[XmlAttribute("Id")]是否具有该属性。

我想知道我有什么遗失的东西吗?

我还尝试为此类[XmlAttribute("z:Id")]添加XMLElement标记的特定名称,但似乎没有做任何事情。我也尝试过包含像IsNullable这样的命名空间,但这会导致错误。

我还尝试将XMLElement置于element4 nil="true"标记内,但是对于具有ExampleObject2的XML元素,但它使整个Hotline为null,这并不完全正确我正在寻找什么。

我已经看过以下问题并且遇到了同样的问题。

how to deserialize an xml node with a value and an attribute using asp.net serialization

谢谢

1 个答案:

答案 0 :(得分:1)

我最终使用像@GeorgeBirbilis这样的Nil属性来修复它并将其与@ dbc的解决方案一起用于手动命名z:和c:来自的命名空间。我只做了一个或另一个,而不是两者合二为一。谢谢你们的帮助。

[XmlAttribute(Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")]
public int Id { get; set; }

[XmlAttribute(Namespace = "http://schemas.microsoft.com/2003/10/Serialization/")]
public int Ref { get; set; }

private bool _nil;

[XmlAttribute("nil", Namespace = "http://www.w3.org/2001/XMLSchema-instance")]
public bool Nil
{
    get
    {
        return _nil;
    }
    set
    {
        _nil = value;
    }
}