XML使用属性序列化复杂类型

时间:2017-11-16 10:28:13

标签: c# .net xml serialization

我目前正在开发.NET 4.6控制台应用程序。我尝试从文件中解析/序列化XML。

目前,我正在努力使用XML中的复杂类型进行序列化。

给出以下XML元素:

<cool_element>
   <master visible="true">A1</master>
</cool_element>

以及它符合XSD规范:

<xs:element name="cool_element">
   <xs:complexType>
      <xs:sequence>
         <xs:element name="master">
            <xs:complexType>
               <xs:simpleContent>
                  <xs:extension base="xs:string">
                     <xs:attribute type="xs:string" name="visible"/>
                 </xs:extension>
              </xs:simpleContent>
            </xs:complexType>
         </xs:element>
      </xs:sequence>
   </xs:complexType>
</xs:element>

我在C#中的序列化类看起来像这样:

[XmlRoot(ElementName = "cool_element")]
public class CoolElement
{
    [XmlElement("master")]
    public string Master { get; set; }
}

这可以很好地检索字符串值。但我不知道如何从我的主元素中看到属性

你对如何解决这个问题有所了解吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

master应该是它自己的对象类,我会这样解决它(注意xml属性的值和可见):

[XmlRoot(ElementName = "cool_element")]
public class CoolElement
{
    private Master masterField;
    public Master master { get { return this.masterField; } set { this.masterField = value; } }
}

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public class Master
{
    private bool visibleField; 

    private string valueField;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public bool visible { get { return this.visibleField; } set { this.visibleField = value; } }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value { get { return this.valueField; } set { this.valueField = value; } }
}

然后阅读数据:

        CoolElement cool = null;
        string path = @"yourxmlfilename.xml";
        XmlSerializer serializer = new XmlSerializer(typeof(CoolElement));
        using (var reader = XmlReader.Create(path))
        {
            cool = (CoolElement)serializer.Deserialize(reader);
            Console.WriteLine("master value: " + cool.master.Value);
            Console.WriteLine("attribute visible value: " + cool.master.visible);
        }

这对你有帮助吗?

相关问题