C#.NET解析XML(使用属性控制 XML 序列化)
使用属性可以控制对象的 XML 序列化。 默认情况下,XML 元素名称由类或成员名称确定。在名为 Book 的简单类中,字段 ISBN 将生成 XML 元素标记 <ISBN>,如下面的示例所示。 [csharp] view plain copy
public class Book
{
public string ISBN;
}
// When an instance of the Book class is serialized, it might
// produce this XML:
// <ISBN>1234567890</ISBN>. 若要重新命名元素,可以更改这种默认行为。下面的代码演示属性 (Attribute) 如何通过设置 XmlElementAttribute 的 ElementName 属性 (Property) 实现此目的。 [csharp] view plain copy
public class TaxRates{
[XmlElement(ElementName = "TaxRate")]
public decimal ReturnTaxRate;
} XmlArrayAttribute 和 XmlArrayItemAttribute 属性旨在用于控制数组的序列化。使用这些属性可以控制元素名称、命名空间以及 XML 架构 (XSD) 数据类型(在万维网联合会 [www.w3.org] 文档“XML 架构第 2 部分:数据类型”中进行了定义)。此外,还可以指定数组所能包含的类型。 对于序列化数组时生成的封闭 XML 元素,其属性将由 XmlArrayAttribute 确定。例如,默认情况下,序列化下面的数组时,将会生成名为Employees 的 XML 元素。Employees 元素将包含在数组类型Employee 之后命名的一系列元素。 [csharp] view plain copy
public class Group{
public Employee[] Employees;
}
public class Employee{
public string Name;
} 序列化实例可能如下所示。 [html] view plain copy
<Group>
<Employees>
<Employee>
<Name>Haley</Name>
</Employee>
</Employees >
</Group> 通过应用 XmlArrayAttribute,可以按照以下方式更改 XML 元素的名称。 [csharp] view plain copy
public class Group{
[XmlArray("TeamMembers")]
public Employee[] Employees;
} 生成的 XML 可能如下所示。 [html] view plain copy
<Group>
<TeamMembers>
<Employee>
<Name>Haley</Name>
</Employee>
</TeamMembers> 另一方面,XmlArrayItemAttribute 可以控制如何序列化数组中包含的项。请注意,该属性将应用于返回数组的字段。 [csharp] view plain copy
public class Group{
[XmlArrayItem("MemberName")]
public Employee[] Employees;
} 生成的 XML 可能如下所示。 [html] view plain copy
<Group>
<Employees>
<MemberName>Haley</MemberName>
</Employees>
</Group> 序列化派生类
XmlArrayItemAttribute 的另一种用法是,允许序列化派生类。例如,可将派生自 Employee 的另一个名为Manager 的类添加至上一示例中。如果没有应用XmlArrayItemAttribute,代码将在运行时失败,原因是无法识别派生类类型。若要解决这个问题,每次为每个可接受类型(基类和派生类)设置 Type 属性 (Property) 时,需要应用该属性 (Attribute) 两次。 [csharp] view plain copy
public class Group{
[XmlArrayItem(Type = typeof(Employee)),
XmlArrayItem(Type = typeof(Manager))]
public Employee[] Employees;
}
public class Employee{
public string Name;
}
public class Manager:Employee{
public int Level;
} 序列化实例可能如下所示。 [html] view plain copy
<Group>
<Employees>
<Employee>
<Name>Haley</Name>
</Employee>
<Employee xsi:type = "Manager">
<Name>Ann</Name>
<Level>3</Level>
<Employee>
</Employees >
</Group>
将数组作为元素序列进行序列化
通过将 XmlElementAttribute 应用于返回数组的字段,还可以将该数组作为 XML 元素的平面序列进行序列化,如下所示。 [csharp] view plain copy
public class Group{
[XmlElement]
public Employee[] Employees;
} 序列化实例可能如下所示。 [html] view plain copy
<Group>
<Employees>
<Name>Haley</Name>
</Employees>
<Employees>
<Name>Noriko</Name>
</Employees>
<Employees>
<Name>Marco</Name>
</Employees>
</Group> 区别两种 XML 流的另一个方法是,使用 XML 架构定义工具,从编译好的代码生成 XML 架构 (XSD) 文档文件。没有将属性应用于字段时,架构会以下列方式描述元素。 <xs:element minOccurs="0" maxOccurs ="1" name="Employees" type="ArrayOfEmployee" />
将 XmlElementAttribute 应用于字段时,生成的架构会以下列方式描述元素。 <xs:element minOccurs="0" maxOccurs="unbounded" name="Employees" type="Employee" />
序列化 ArrayList
ArrayList 类可能包含各种不同对象的集合。因此,可以按照使用数组的类似方式使用 ArrayList。您可以创建返回单个ArrayList 的字段,而不用创建返回类型化对象的数组的字段。但是,与数组相同的是,必须将ArrayList 包含的对象的类型告知 XmlSerializer。为此,需要为该字段分配XmlElementAttribute 的多个实例,如下面的示例所示。 [csharp] view plain copy
public class Group{
[XmlElement(Type = typeof(Employee)),
XmlElement(Type = typeof(Manager))]
public ArrayList Info;
} 使用 XmlRootAttribute 和 XmlTypeAttribute 控制类的序列化
能且只能应用于一个类的属性有下面两种:XmlRootAttribute 和 XmlTypeAttribute。这两种属性非常相似。XmlRootAttribute 只能应用于一个类:序列化时,该类表示 XML 文档的开始和结束元素,也就是根元素。另一方面,XmlTypeAttribute 可以应用于任何一个类,包括根类。 例如,在上面的示例中,Group 类就是根类,而其所有的公共字段和属性变成 XML 文档中的 XML 元素。因此,只能有一个根类。通过应用XmlRootAttribute,可以控制XmlSerializer 所生成的 XML 流。例如,可以更改元素名称和命名空间。 使用 XmlTypeAttribute 可以控制所生成 XML 的架构。需要通过 XML Web services 发布架构时,这项功能很有用。下面的示例将XmlTypeAttribute 和XmlRootAttribute 同时应用于同一个类。 [csharp] view plain copy
[XmlRoot("NewGroupName")]
[XmlType("NewTypeName")]
public class Group{
public Employee[] Employees;
} 如果对该类进行编译,并且使用 XML 架构定义工具生成其架构,可能会找到下面描述 Group 的 XML。 <xs:element name="NewGroupName" type="NewTypeName"> 相比之下,如果是对该类的实例进行序列化,则只能在 XML 文档中找到 NewGroupName。 <NewGroupName> . . .</NewGroupName> 最后来贴一个自己的XML解析实例 XML结构如下: [html] view plain copy
<?xml version="1.0" encoding="utf-8"?>
<Root>
<Person IDCard="610424199902230099" Name="小田雨" MedicalID="体检编号" Sex="男" Age="22" MedicalRecordDate ="2011-01-01" MedicalReportDate="2011-01-01"
MedicalCount="体检次数" HospitalID="001" HospitalName="兴隆园医院" >
<Results>
<Result></Result>
<Result></Result>
<Result></Result>
</Results>
<Conclusions>
<Conclusion></Conclusion>
<Conclusion></Conclusion>
<Conclusion></Conclusion>
</Conclusions>
<Suggestions>
<Suggestion></Suggestion>
<Suggestion></Suggestion>
<Suggestion></Suggestion>
</Suggestions>
<Health> 为空(预留)</Health>
</Person> <MedicalItems>
<MedicalSub ID ="0001" Name="化学检查" >
<MedicalType ID ="0001001" Name="血常规" MedicalDoc="体检医师名字" MedicalDate="2011-02-13"> <Item ID="000100010001" Name="白细胞" Unit="G/L" Parameters="3.7--10.0" >
<Results>H==高,L=低,N=正常</Results>
<Value>11.1</Value>
<Disease></Disease>
<MedicalBodyPart> </MedicalBodyPart>
<MedicalImage> </MedicalImage>
<Conclusion ></Conclusion>
</Item>
<Item ID="000100010002" Name="红细胞" Unit="G/L" Parameters="3.7--10.0">
<Results>H==高,L=低,N=正常</Results>
<Value>11.1</Value>
<Disease></Disease>
<MedicalBodyPart> </MedicalBodyPart>
<MedicalImage> </MedicalImage>
<Conclusion ></Conclusion>
</Item>
</MedicalType>
</MedicalSub>
<MedicalSub ID ="0002" Name="物理检查" >
<MedicalType ID ="0002001" Name="B超" MedicalDoc="体检医师名字" MedicalDate="2011-02-13">
<Item ID="000200010001" Name="胸部B超" Unit=" " Parameters="">
<Results>A=异常,N=正常</Results>
<Value></Value>
<Disease>病种,未见异常</Disease>
<MedicalBodyPart>检查部位:胸部</MedicalBodyPart>
<MedicalImage>影像所见</MedicalImage>
<Conclusion >检查结论</Conclusion>
</Item>
<Item ID="000200010002" Name="腹部B超" Unit=" " Parameters="">
<Results>A=异常,N=正常</Results>
<Value></Value>
<Disease>病种,未见异常</Disease>
<MedicalBodyPart>检查部位:腹部</MedicalBodyPart>
<MedicalImage>影像所见</MedicalImage>
<Conclusion >检查结论</Conclusion>
</Item>
</MedicalType> </MedicalSub>
<MedicalSub ID ="0005" Name="五官科" >
<MedicalType ID ="0005001" Name="眼科" MedicalDoc="体检医师名字" MedicalDate="2011-02-13">
<Item ID="000500010001" Name="视力/右" Unit=" " Parameters="1.0-1.5">
<Results>A=异常,N=正常</Results>
<Value>1.5</Value>
<Disease>病种,未见异常</Disease>
<MedicalBodyPart>检查部位</MedicalBodyPart>
<MedicalImage>影像所见</MedicalImage>
<Conclusion >检查结论</Conclusion>
</Item>
<Item ID="000500010002" Name="矫正视力/右" Unit=" " Parameters="1.0-1.5">
<Results>A=异常,N=正常</Results>
<Value>0.8</Value>
<Disease>病种,未见异常</Disease>
<MedicalBodyPart>检查部位</MedicalBodyPart>
<MedicalImage>影像所见</MedicalImage>
<Conclusion >检查结论</Conclusion>
</Item>
</MedicalType> </MedicalSub>
</MedicalItems>
</Root> 实例 C#代码如下: 代码有点多 [csharp] view plain copy
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Serialization; using System.IO; namespace 天健接口
{
class Program
{
static void Main(string[] args)
{
Root r = new Root(); r.Person = new Person();
r.Person.IDCard = "22";
r.Person.Results = new List<string>();
r.Person.Results.Add("1");
r.Person.Results.Add("1");
r.Person.Results.Add("1");
r.Person.Suggestions = new List<string>();
r.Person.Suggestions.Add("2");
r.Person.Suggestions.Add("2");
r.Person.Suggestions.Add("2"); r.MedicalItems = new List<MedicalSub>();
MedicalSub ms = new MedicalSub();
ms.ID = "ss";
ms.Name="de";
ms.MedicalType = new MedicalType();
ms.MedicalType.ID = "wa";
ms.MedicalType.Name = "s";
ms.MedicalType.MedicalDoc= "qa";
ms.MedicalType.MedicalDate = "2010-5-5";
ms.MedicalType.Item = new List<Item>();
Item it = new Item();
it.ID = "f";
it.Name = "s";
it.Results = "s";
ms.MedicalType.Item.Add(it);
ms.MedicalType.Item.Add(it);
r.MedicalItems.Add(ms);
r.MedicalItems.Add(ms); Console.WriteLine("序列化成功……");
Console.WriteLine(XmlSerialize.SerializeXML<Root>(r)); }
} [Serializable]
public class Root
{
//[XmlElement]
public Person Person; public List<MedicalSub> MedicalItems;
} [Serializable]
public class Person
{
[XmlAttribute]
public string IDCard; [XmlAttribute]
public string Name; [XmlAttribute]
public string MedicalID; [XmlAttribute]
public string Sex; [XmlAttribute]
public string Age; [XmlAttribute]
public string MedicalRecordDate; [XmlAttribute]
public string MedicalReportDate; [XmlAttribute]
public string MedicalCount; [XmlAttribute]
public string HospitalID; [XmlAttribute]
public string HospitalName; [XmlArrayItem("Result")]
public List<string> Results; [XmlArrayItem("Conclusion")]
public List<string> Conclusions; [XmlArrayItem("Suggestion")]
public List<string> Suggestions; public String Health;
} [Serializable]
public class MedicalSub
{
[XmlAttribute]
public string ID; [XmlAttribute]
public string Name; public MedicalType MedicalType; } [Serializable]
public class MedicalType
{
[XmlAttribute]
public string ID; [XmlAttribute]
public string Name; [XmlAttribute]
public string MedicalDoc; [XmlAttribute]
public string MedicalDate; [XmlElement]
public List<Item> Item;
} public class Item
{
[XmlAttribute]
public string ID; [XmlAttribute]
public string Name; [XmlAttribute]
public string Unit; [XmlAttribute]
public string Parameters; public string Results; public string Value; public string Disease; public string MedicalBodyPart; public string MedicalImage; public string Conclusion; } public class XmlSerialize
{
/// <summary>
/// 反序列化XML为类实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xmlObj"></param>
/// <returns></returns>
public static T DeserializeXML<T>(string xmlObj)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
using (StringReader reader = new StringReader(xmlObj))
{
return (T)serializer.Deserialize(reader);
}
} /// <summary>
/// 序列化类实例为XML
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static string SerializeXML<T>(T obj)
{
using (StringWriter writer = new StringWriter())
{
new XmlSerializer(obj.GetType()).Serialize((TextWriter)writer, obj);
return writer.ToString();
}
}
} }
参考:
http://blog.csdn.net/bdstjk/article/details/7210742
C#.NET解析XML(使用属性控制 XML 序列化)的更多相关文章
- 在C#中使用属性控制 XML 序列化来解析XML
今天需要解析一个XML,这个XML和一般情况用.NET的序列化出来的格式不太一样. 我就又补习了一下. 分享一下学习成果吧. 示例代码下载: http://download.csdn.net/deta ...
- 用来控制 XML 序列化的属性
通过将下表中的属性应用于类和类成员,可以控制 XmlSerializer 序列化或反序列化该类的实例的方式.若要了解这些属性如何控制 XML 序列化,请参见使用属性控制 XML 序列化. 这些属性还可 ...
- .NET中XML序列化和反序列化常用类和用来控制XML序列化的属性总结(XmlSerializer,XmlTypeAttribute,XmlElementAttribute,XmlAttributeAttribute,XmlArrayAttribute...)
序列化和反序列化是指什么? 序列化(seriallization): 将对象转化为便于传输的数据格式, 常见的序列化格式:二进制格式,字节数组,json字符串,xml字符串.反序列化(deserial ...
- CSS控制XML与通过js解析xml然后通过html显示xml中的数据
使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} p ...
- Java读取数据库中的xml格式内容,解析后修改属性节点内容并写回数据库
直接附代码: 1.测试用的xml内容 <mxGraphModel> <root> <mxCell id="-1" /> <mxCell i ...
- XML标签属性
0. 内容索引 1. XML序列化与反序列化 2. 相关的常用Attribute 3. 相关的全部Attribute 4. XML序列化答疑 5. 高级议题 1. XML序列化与反序列化 // OBJ ...
- xml解析----java中4中xml解析方法(转载)
转载:https://www.cnblogs.com/longqingyang/p/5577937.html 描述 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与 ...
- JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)
1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...
- php 修改、增加xml结点属性的实现代码
php修改xml结点属性,增加xml结点属性的代码,有需要的朋友可以参考下 php 修改 增加xml结点属性的代码,供大家学习参考.php修改xml结点属性,增加xml结点属性的代码,有需要的朋友,参 ...
随机推荐
- 区块链学习——HyperLedger-Fabric v1.0 启动过程分析
本章我们从fabric v1.0的e2e_cli示例开始分析整个启动过程以及在过程中的一些配置文件 首先呢,还是确保你的基本环境已经搭建完成,v1.0源码和镜像也都下载完毕 fabric启动过程中的相 ...
- springboot pom问题及注解
springboot pom不需要指定版本号 springboot会自己管理版本号 <!-- 支持热部署 --> <dependency> <groupId>org ...
- MySQL自动备份实战--xtrabackup备份
MySQL数据备份企业实战.制作shell脚本 功能1:使用xtrabackup以每周为一个备份周期做备份(数据库+二进制日志,备份至本地/data/backup).提示: 周一某个时间点做一次完全备 ...
- 关于Debug Assertion Failed问题
书上代码: #include<stdio.h> #include<stdlib.h> /* 提供malloc().free()函数 */ #include<string. ...
- CSS的响应式布局
响应式布局是什么 它是相对于固定像素大小的网页而言的,顾名思义,响应式布局就是网页能够响应各种各样不同分辨率大小的设备,能够将网页很好的呈献给用户. 如何实现响应式布局? 1.CSS3@media查询 ...
- springcloud-zuul初级篇
一 前言 zuul路由网关的核心作用是用于后台服务的统一管理:由于微服务是部署在多台服务器上,服务器的ip地址并不能统一,我们需要暴露一个统一的ip地址给前台使用进行接口调用:zuul就是起到路由网关 ...
- 看完这篇微服务架构设计思想,90%的Java程序员都收藏了
本博客强烈推荐: Java电子书高清PDF集合免费下载 https://www.cnblogs.com/yuxiang1/p/12099324.html 微服务 软件架构是一个包含各种组织的系统组织, ...
- 数据包报文格式(IP包、TCP报头、UDP报头)
转自: https://blog.51cto.com/lyhbwwk/2162568 一.IP包格式 IP数据包是一种可变长分组,它由首部和数据负载两部分组成.首部长度一般为20-60字节(Byte) ...
- The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)
题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+ ...
- spring SpEL--转
原文:http://www.tuicool.com/articles/Jbq2QnM 概要: Spring表达式语言:SpEL Spring表达式语言 (简称 SpEL ):是一个 支持运行时查询和操 ...