XML标签属性

0. 内容索引

1. XML序列化与反序列化
2. 相关的常用Attribute
3. 相关的全部Attribute
4. XML序列化答疑
5. 高级议题

1. XML序列化与反序列化

        // OBJECT -> XML
        public static void SaveXml(string filePath, object obj)
        {
            SaveXml(filePath, obj, obj.GetType());
        }

        public static void SaveXml(string filePath, object obj, System.Type type)
        {
            using (System.IO.StreamWriter writer = new System.IO.StreamWriter(filePath))
            {
                System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(type);
                xs.Serialize(writer, obj);
                writer.Close();
            }
        }


        // XML -> OBJECT
        public static object LoadXml(string filePath, System.Type type)
        {
            if (!System.IO.File.Exists(filePath))
                return null;
            using (System.IO.StreamReader reader = new System.IO.StreamReader(filePath))
            {
                System.Xml.Serialization.XmlSerializer xs = new System.Xml.Serialization.XmlSerializer(type);
                object obj = xs.Deserialize(reader);
                reader.Close();
                return obj;
            }
        }

2. 相关的常用Attribute(命名空间System.Xml.Serialization)

  • [XmlRootAttribute("PurchaseOrder", Namespace="http://www.cpandl.com", IsNullable=false)] // 指定根

  • [XmlIgnoreAttribute] // 跳过不序列化

  • [XmlArrayAttribute("Items")] public OrderedItem[] OrderedItems; // 层次序列化: <OrderedItem.../><OrderedItem.../>..

  • [XmlElementAttribute(ElementName="Link", IsNullable=false)] public Link[] Links; // 平面序列化: <Link ..../><Link .../>...

  • [XmlAttribute("Cat")] public string Cat; // 表现为属性<... Cat=.. />
  • [XmlElementAttribute(IsNullable=false)] // 表现为节点..


3. 相关的全部Attribute(命名空间System.Xml.Serialization)

标签名说明
XmlAttributes表示一个特性对象的集合,这些对象控制XmlSerializer如何序列化和反序列化对象
XmlArrayAttribute指定 XmlSerializer 应将特定的类成员序列化为 XML 元素数组
XmlArrayItemAttribute指定 XmlSerializer 可以放置在序列化数组中的派生类型
XmlArrayItemAttributes表示 XmlArrayItemAttribute 对象的集合
XmlAttributeAttribute指定 XmlSerializer 应将类成员作为 XML 特性序列化
XmlChoiceIdentifierAttribute指定可以通过使用枚举来进一步消除成员的歧
XmlElementAttributeXmlSerializer序列化或反序列化包含对象时,指示公共字段或属性表示XML元素
XmlElementAttributes表示XmlElementAttribute 的集合,XmlSerializer 将其用于它重写序列化类的默认方式
XmlEnumAttribute控制 XmlSerializer 如何序列化枚举成员
XmlIgnoreAttribute指示 XmlSerializer 的 Serialize 方法不序列化公共字段或公共读/写属性值
XmlIncludeAttribute允许 XmlSerializer 在它序列化或反序列化对象时识别类型
XmlRootAttribute控制视为 XML 根元素的属性目标的 XML 序列化
XmlTextAttribute当序列化或反序列化包含类时,向 XmlSerializer 指示应将此成员作为 XML 文本处理
XmlTypeAttribute控制当属性目标由 XmlSerializer 序列化时生成的 XML 架构
XmlAnyAttributeAttribute指定成员(返回 XmlAttribute 对象的数组的字段)可以包含任何 XML 属性
XmlAnyElementAttribute指定成员(返回 XmlElement 或 XmlNode 对象的数组的字段)可以包含对象,该对象表示在序列化或反序列化的对象中没有相应成员的所有 XML 元素
XmlAnyElementAttributes表示 XmlAnyElementAttribute 对象的集合
XmlAttributeEventArgs为 UnknownAttribute 事件提供数据
XmlAttributeOverrides允许您在使用 XmlSerializer 序列化或反序列化对象时重写属性,字段和类特性
XmlElementEventArgs为 UnknownElement 事件提供数据
XmlNamespaceDeclarationsAttribute指定目标属性、参数、返回值或类成员包含与 XML 文档中所用命名空间关联的前缀
XmlNodeEventArgs为 UnknownNode 事件提供数据
XmlSerializer将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。XmlSerializer 使您得以控制如何将对象编码到 XML 中
XmlSerializerNamespaces包含 XmlSerializer 用于在 XML 文档实例中生成限定名的 XML 命名空间和前缀
XmlTypeMapping包含从一种类型到另一种类型的映射

4. XML序列化答疑

  1. 需序列化的字段必须是公共的(public)
  2. 需要序列化的类都必须有一个无参的构造函数
  3. 枚举变量可序列化为字符串,无需用[XmlInclude]
  4. 导出非基本类型对象,都必须用[XmlInclude]事先声明。该规则递归作用到子元
    • 如导出ArrayList对象,若其成员是自定义的,需预包含处理:
      using System.Xml.Serialization; [XmlInclude(typeof(自定义类))]
  5. Attribute中的IsNullable参数若等于false,表示若元素为null则不显示该元素
  6. 真正无法XML序列化的情况
    • 某些类就是无法XML序列化的(即使使用了[XmlInclude])
      IDictionary(如HashTable) System.Drawing.Color System.Drawing.Font SecurityAttribute声明
      父类对象赋予子类对象值的情况
      对象间循环引用
  7. 对于无法XML序列化的对象,可考虑
    • 使用自定义xml序列化(实现IXmlSerializable接口)
    • 实现IDictionary的类,可考虑(1)用其它集合类替代;(2)用类封装之,并提供Add和this函
    • 某些类型需要先经过转换,然后才能序列化为XML。如XML序列化System.Drawing.Color,可先用ToArgb()将其转换为整数,过于复杂的对象用xml序列化不便的话,可考虑用二进制序列化

5. 高级议题

5.1 序列化中异常的扑捉

使用Exception.Message只会得到简单的信息“行***错误",可以使用Exception.InnerException.Message得到更详尽的信息可使用事件代理来处理解析不了的XML节点

XmlSerializer serializer     = new XmlSerializer(typeof(PurchaseOrder));
serializer.UnknownNode      += new XmlNodeEventHandler(serializer_UnknownNode);
serializer.UnknownAttribute += new XmlAttributeEventHandler(serializer_UnknownAttribute);
    
protected void serializer_UnknownNode(object sender, XmlNodeEventArgs e)
{
  Console.WriteLine("Unknown Node:" +   e.Name + "\t" + e.Text);
}

protected void serializer_UnknownAttribute(object sender, XmlAttributeEventArgs e)
{
  System.Xml.XmlAttribute attr = e.Attr;
  Console.WriteLine("Unknown attribute " +  attr.Name + "='" + attr.Value + "'");
}

5.2 集合类(IEnumerable, ICollection)必须满足下列规则才可XML序列化:

  • 不得实现 IDictionary。
  • 必须有一个 Add 方法,该方法不是由该接口定义的,因为它通常是为该集合将要容纳的专用类型而创建的
  • 必须有一个索引器, 且参数为 System.Int32 (C# int)
  • 在 Add、Count 和索引器中不能有任何安全特性(SecurityAttribute)可序列化集合类例程:
public class PublisherCollection : CollectionBase
 {
 
   public int Add(Publisher value)
   {
     return base.InnerList.Add(value);
   }
   
   public Publisher this[int idx]
   {
     get { return (Publisher) base.InnerList[idx]; }
     set { base.InnerList[idx] = value; }
   }
   
 }

5.3 某些类是以程序集的形式提供的,无法修改其源码,可用XmlAttributeOverrides设置其序列化特性

XML数据

<?xml version="1.0" encoding="utf-8"?>
<Inventory >
  <Product>
    <ProductID>100</ProductID>
    <ProductName>Product Thing</ProductName>
    <SupplierID>10</SupplierID>
  </Product>
  <Book>
    <ProductID>101</ProductID>
    <ProductName>How to Use Your New Product Thing</ProductName>
    <SupplierID>10</SupplierID>
    <ISBN>123456789</ISBN>
  </Book>
</Inventory>
        

源类(无法修改)

public class Inventory
  {
     private Product[] stuff;
     public Inventory() {}
     public Product[] InventoryItems {get {return stuff;} set {stuff=value;}}
  }

附加XmlAttributeOverrides后即可序列化

  XmlAttributes attrs = new XmlAttributes();
  attrs.XmlElements.Add(new XmlElementAttribute("Book", typeof(BookProduct)));
  attrs.XmlElements.Add(new XmlElementAttribute("Product", typeof(Product)));
  
  //add to the Attributes collection
  XmlAttributeOverrides attrOver = new XmlAttributeOverrides();
  attrOver.Add(typeof(Inventory), "InventoryItems", attrs);
  
  //deserialize and load data into the listbox from deserialized object
  FileStream f=new FileStream("..\\..\\..\\inventory.xml",FileMode.Open);
  
  XmlSerializer newSr = new XmlSerializer(typeof(Inventory), attrOver);
  Inventory newInv    = (Inventory)newSr.Deserialize(f);

转载于:https://www.cnblogs.com/FounderBox/p/4646195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值