我有这种形式的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;
答案 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