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

时间: 2024-07-31 14:34:38

C#.NET解析XML(使用属性控制 XML 序列化)的相关文章

用来控制 XML 序列化的属性

通过将下表中的属性应用于类和类成员,可以控制 XmlSerializer 序列化或反序列化该类的实例的方式.若要了解这些属性如何控制 XML 序列化,请参见使用属性控制 XML 序列化. 这些属性还可用于控制 XML Web services 生成的文本样式的 SOAP 消息.有关将这些属性应用于 XML Web services 方法的更多信息,请参见使用 XML Web services 进行 XML 序列化. 有关属性的更多信息,请参见Extending Metadata Using At

html标签中lang属性及xml:lang属性的作用

lang属性:HTML语言声明属性,用来定义当前文档显示的语言. 如:lang="en"表示定义语言为英文:lang="zh-CN"表示定义语言为中文.其实对于文档显示来说怎样写都无所谓,定义成en的文档也可以显示中文,定义成zh-CN的文档也可以显示英文.但还是应该遵循标准,毕竟这个属性对浏览器和搜索引擎还是有作用的. 其实,在新的XHTML文档中,lang属性已经被xml:lang属性代替.但是,XHTML规范建议在XHTML 1.0文档的<html>

CSS控制XML与通过js解析xml然后通过html显示xml中的数据

使用CSS控制XML的显示 book.css bookname{ display:block;color:Red} author{ display:block;font-style:italic} price{ display:block;colo book.xml <?xml version="1.0" encoding="GB2312" ?> <?xml-stylesheet type="text/css" href=&qu

xml解析----java中4中xml解析方法(转载)

转载:https://www.cnblogs.com/longqingyang/p/5577937.html 描述 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种:1.DOM解析:2.SAX解析:3.JDOM解析:4.DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只

xml语法、DTD约束xml、Schema约束xml、DOM解析xml

今日大纲 1.什么是xml.xml的作用 2.xml的语法 3.DTD约束xml 4.Schema约束xml 5.DOM解析xml 1.什么是xml.xml的作用 1.1.xml介绍 在前面学习的html语言,html是超文本标记语言,使用html语言规定好的标签来封装文本数据.而html使用的标签html语言规定好的,每个标签都有自己特定的功能. xml语言,可扩展的标记语言,这门语言它没有定义任何的标记,而标记是由使用者自己来定义,但是由于标签名称以及属性名称都由用户自己来命名,导致别人在使

解析从服务器端返回的xml文件流

服务器端有xml流过来,为了解析,最初使用的方法是构建一个StringBuilder,在onMessage方法中不断append,最终形成一个完成的xml文件字符串(其中包含多个xml).最后使用DocumentBuilder来解析.这种做法在数据量小的时候可以维持,当一次传来大量xml,便会出现OOM. 改良后的方法使用边接收数据,边解析的异步方式,这样解析过的部分就可以丢掉而不继续占用内存. 准备工作,需要熟悉的API, com.sun.jersey.api.client.Client :

通过pull解析器操作安卓的xml

通过pull解析器操作安卓的xml 例子定义了一个javabean用于存放上面解析出来的xml内容, 这个javabean为Person,代码请见本页下面备注: ============================================================================================== 使用pull解析器解析person.xml文件 public class PersonService {  public static List g

Android下使用pull解析器生成XML文件、读取XML文件

Android下使用Pull解析器 1,Pull解析器的运行方式与SAX解析器相似.它提供了类似的事件,如:开始元素和结束元素事件. 2,使用parser.next()可以进入下一个元素并触发相应事件. 3,事件将作为一个int数值被发送,因此可以使用一个switch对相应的事件进行处理. 4,当元素开始解析时,调用parser.nextText()方法可以获取下一个Text类型节点的值. 5,相关API: 获得当前节点事件类型:parser.getEventType(); 获得下一节点事件类型

简单分析android textview xml 的属性设置

android:ems 设置TextView的宽度为N个字符的宽度. 这样的好处就是,在定义编辑框空间输入多少字符的时候,可以根据固定的值设置编辑框宽度.保证边框和文字的宽度统一.android:maxems 设置TextView的宽度为最长为N个字符的宽度.与ems同时使用时覆盖ems选项. 一搬也是在控制文字的数据的个数上做了一定的限制android:minems 设置TextView的宽度为最短为N个字符的宽度.与ems同时使用时覆盖ems选项. 同上android:maxLength 限