【问题标题】:XML serialize complex type with attributeXML用属性序列化复杂类型
【发布时间】:2018-04-29 20:22:07
【问题描述】:

我目前正在开发一个 .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; }
}

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

你知道如何解决这个问题吗?

谢谢!

【问题讨论】:

    标签: c# .net xml serialization


    【解决方案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);
            }
    

    这对你有帮助吗?

    【讨论】:

    • 谢谢!帮了我很多:) ...我稍微简化了 Master 类,我只使用属性,没有私有成员。
    • 太棒了,很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多