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 | 指定可以通过使用枚举来进一步消除成员的歧 |
XmlElementAttribute | XmlSerializer序列化或反序列化包含对象时,指示公共字段或属性表示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序列化答疑
- 需序列化的字段必须是公共的(public)
- 需要序列化的类都必须有一个无参的构造函数
- 枚举变量可序列化为字符串,无需用[XmlInclude]
- 导出非基本类型对象,都必须用[XmlInclude]事先声明。该规则递归作用到子元
- 如导出ArrayList对象,若其成员是自定义的,需预包含处理:
using System.Xml.Serialization; [XmlInclude(typeof(自定义类))]
- 如导出ArrayList对象,若其成员是自定义的,需预包含处理:
- Attribute中的IsNullable参数若等于false,表示若元素为null则不显示该元素
- 真正无法XML序列化的情况
- 某些类就是无法XML序列化的(即使使用了[XmlInclude])
IDictionary(如HashTable) System.Drawing.Color System.Drawing.Font SecurityAttribute声明
父类对象赋予子类对象值的情况
对象间循环引用
- 某些类就是无法XML序列化的(即使使用了[XmlInclude])
- 对于无法XML序列化的对象,可考虑
- 使用自定义xml序列化(实现
IXmlSerializable
接口) - 实现
IDictionary
的类,可考虑(1)用其它集合类替代;(2)用类封装之,并提供Add和this函 - 某些类型需要先经过转换,然后才能序列化为XML。如XML序列化
System.Drawing.Color
,可先用ToArgb()将其转换为整数,过于复杂的对象用xml序列化不便的话,可考虑用二进制序列化
- 使用自定义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);
XML标签属性的更多相关文章
- dom4j 解析 xml标签属性
重写onEnd()和onStart()方法 public class XmlElementHandler implements ElementHandler { @Override public vo ...
- js解析xml,获取XMl标签属性值
<script type="text/javascript"> var xml="<?xml version=\"1.0\" enc ...
- 在解析XML时要注意解析元素和解析标签属性的区别
解析元素时: Sting str = ele.elementText("name"); 而解析标签属性时: String key = ele.attributeValue(&quo ...
- HTML标签界里不会再用到的标签属性(一)
为了成为一名初级前端开发工程师,最近正在探寻HTML标签的众多奥秘,果不其然,让我发现了许多被“冷落”了的标签属性. 一.<!DOCTYPE> 自从HTML5流行之后,<!DOCTY ...
- PHP通用的XSS攻击过滤函数,Discuz系统中 防止XSS漏洞攻击,过滤HTML危险标签属性的PHP函数
XSS攻击在最近很是流行,往往在某段代码里一不小心就会被人放上XSS攻击的代码,看到国外有人写上了函数,咱也偷偷懒,悄悄的贴上来... 原文如下: The goal of this function ...
- XML标签
SQL标签库提供了创建和操作XML文档的标签. 引入语法:<%@ taglib prefix="x" uri="http://java.sun.com/jsp/js ...
- [Java] 解决spring的xml标签内不能自由增加说明的难题,方便调试、部署时进行批量屏蔽
作者:zyl910 以往我们想在spring的xml配置文件中增加说明文本时,只能使用xml注释(<!-- 注释 -->).这对于"调试.部署时想批量屏蔽部分bean" ...
- 常用HTML meta 标签属性(网站兼容与优化需要),meta标签
常用HTML meta 标签属性(网站兼容与优化需要),meta标签 标签提供关于HTML文档的元数据.元数据不会显示在页面上,但是对于机器是可读的.它可用于浏览器(如何显示内容或重新加载页面),搜索 ...
- JSP标准标签库(JSTL)--XML标签库 x
³在开发中XML解析的操作是非常烦琐的,幸运的是在JSTL中专门提供了用于XML解析的操作,这样用户就可以不用费力的去研究SAX或DOM等操作的使用,就可以轻松的进行XML文件的解析处理. XML标 ...
随机推荐
- 值得一做》关于一道暴搜BZOJ1024(EASY+)
为什么要写这道题的DP捏? 原因很简单,因为为原来在openjudge上有一道题叫分蛋糕,有一个思路和这道题很像:“分锅”. 分锅:即为考虑计算当前情况的最优解时,把当前状态结果,分散为考虑当前状态的 ...
- cocos2dx 屏幕分辨率问题
做手机上的软件首先要考虑的就是屏幕分辨率怎么解决.coco2dx已经有了很好的解决方法. 用cocos2dx的python脚本创建工程时默认生成一个Helloworld的demo.我们就以这个demo ...
- 使用 XML-RPC 为 C++ 应用程序启用 Web 服务
http://www.ibm.com/developerworks/cn/webservices/ws-xml-rpc/ 引言 Internet 现在的受欢迎程度越来越高,由于这个原因及其固有的优势, ...
- javascript对变量和函数的声明提前‘hoist’
hoist vt.升起,提起; vi.被举起或抬高; n.起重机,升降机; 升起; <俚>推,托,举; 原文地址:http://www.bootcss.com/article/variab ...
- Redis清理
Redis登录: Redis目录: redis-cli.exe -h 127.0.0.1 -p 6739 login: auth “password” flushall
- 使用第三方库连接MySql数据库:PyMysql库和Pandas库
使用PyMysql库和Pandas库链接Mysql 1 系统环境 系统版本:Win10 64位 Mysql版本: 8.0.15 MySQL Community Server - GPL pymysql ...
- ubuntu启动流程和要读取相关文件
当前系统环境为:linux mint mate 17.1(基于ubuntu14.04的衍生版) 查阅资料后总结如下: 首先: /etc/rc.d链接目标为:/etc /etc/rc*.d文件夹中的脚本 ...
- SQL的Join语法
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...
- TinyMCE3.x整合教程-Xproer.WordPaster
版权所有 2009-2017 荆门泽优软件有限公司 保留所有权利 官方网站:http://www.ncmem.com/ 产品首页:http://www.ncmem.com/webplug/wordpa ...
- RollingFileAppender
http://logback.qos.ch/manual/appenders.html#RollingFileAppender 1.基于时间的滚动策略 TimeBasedRollingPolicy 就 ...