将不同的元素标记反序列化为一个对象类?

时间:2014-07-08 09:51:10

标签: c# xml serialization

我有这种形式的xml

<Element attributeX="X" attributeY="Y"> 
  <SubElement attributeX="X" attributeZ="Z"/>
</Element>
<Element attributeX="X" attributeY="Y"> 
  <SubElement attributeX="X" attributeZ="Z"/>
  <Element attributeX="X" attributeY="Y">
    <SubElement attributeX="X" attributeZ="Z"/>
  </Element>
</Element>

但在代码中我有一个&#34; Element&#34;的对象类。和&#34;子元素&#34;具有属性&#34;属性&#34; &#34; attributeX&#34;和&#34; attributeZ&#34;,我找不到一种方法来对XML进行反序列化?

我想补充说,你的例子与你给我的链接不同。实际上这里是我在代码中的类

public class Element
{
  public type1 attributeX;
  public type1 attributeY;
  public type1 attributeZ;

  public observableCollection<Element> Elements;
}

并且在xml文件中我有不同的标签:*当我有属性Z时的子元素*当我有属性时的元素

因此,在进行desrialisation&#34;元素&#34;和&#34; subElement&#34;应该具有相同的类类型&#34;元素&#34;

2 个答案:

答案 0 :(得分:1)

以下示例可能是您旅程的一个良好开端:

public class Element
{
    [XmlAttribute]
    public type1 attributeX { get; set; }

    [XmlAttribute]
    public type1 attributeY { get; set; }
    [XmlIgnore]
    public bool attributeYSpecified { get { return attributeY != null; } set { } }

    [XmlAttribute]
    public type1 attributeZ { get; set; }
    [XmlIgnore]
    public bool attributeZSpecified { get { return attributeZ != null; } set { } }

    [XmlChoiceIdentifier("ElementTypes")]
    [XmlElement("Element", typeof(Element))]
    [XmlElement("SubElement", typeof(Element))]
    public Element[] Elements { get; set; }

    [XmlIgnore]
    public ElementType[] ElementTypes
    {
        get
        {
            return Elements
                .Select(el => (el.attributeYSpecified && !el.attributeZSpecified) ?
                              ElementType.Element :
                              (!el.attributeYSpecified && el.attributeZSpecified) ?
                              ElementType.SubElement :
                              ElementType.None)
                .ToArray();
        }
        set
        {
        }
    }
}

public enum ElementType
{
    None,
    Element,
    SubElement
}

请注意,我定义了每个*Specified属性以查找null值,但如果type1是值类型,则可能需要将它们保留为简单属性并手动检查它们反序列化后,将它们设置为正确的序列化。

None枚举值是故意的,以便在事情看起来很奇怪时使序列化失败。但是,如果您有一些可以同时具有Y和Z属性的合理默认值,则可以将其删除。

答案 1 :(得分:0)

如果您遇到这种情况,建议您查看以下内容: http://msdn.microsoft.com/en-us/library/system.runtime.serialization.iserializable(v=vs.110).aspx

这将允许您手动指定序列化和序列化算法。

如果仅用于xml:

,也可以使用它

http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable(v=vs.110).aspx

以下是如何实施后者的示例:

http://www.codeproject.com/Articles/43237/How-to-Implement-IXmlSerializable-Correctly