- ·上一篇文章:Asp.net中的页面乱码的问题
- ·下一篇文章:ASP.NET数据库编程快速入门之技术慨述(6)
在 .NET Framework 中表示 XML 的最佳做法
public string Subject{ get { return subject; } set {subject = value; }}private DateTime sent;public DateTime Sent{ get { return sent; } set {sent = value; }}private XmlDocument body = new XmlDocument();public string Body{ get { return body.OuterXml; } set { body.Load(new System.IO.StringReader(value));}} }
使用字符串作为表示 XML 文档的字段或属性的主要表示方式是最具用户友好性的表示方式,因为 System.String 类是一般开发人员最熟悉的 XML“常见疑点”。但是,这将会增加使用该类的用户的负担,这些用户现在可能必须应付两次分析 XML 文档的成本。例如,设想一种情况:在从 SqlCommand.ExecuteXmlReader() method(英文)或 XslTransform.Transform() method(英文)所得到的 XML 中设置了这样一个属性。在这种情况下,用户将必须分析文档两次,如下例所示:
Email email= new Email();email.From = "dareo@example.com";email.To= "michealb@example.org";email.Subject = "Hello World";XslTransform transform = new XslTransform();transform.Load("format-body.xsl");XmlDocument body = new XmlDocument();//1. XML 由 XmlDocument.Load() 分析 body.Load(transform.Transform(new XPathDocument("body.xml"), null)); //2. 同一 XML 被 Email.Body 属性中的 XmlDocument.Load() 再次分析email.Body = body.OuterXml;
在上例中,同一 XML 被分析了两次,因为在将该 XML 转换成字符串之前必须将其从 XmlReader 加载到 XmlDocument 中,然后使用该 XML 设置 Email 类的 Body 属性,再由该属性本身从内部将该 XML 分析为 XmlDocument。一条很有效的经验法则就是提供对 XML 属性的访问(作为 XmlReader 和字符串)。因此,还应将下列方法添加到 Email 类,以使该类的用户获得最大的灵活性:
public void SetBody(XmlReader reader){ body.Load(reader);}public XmlReader GetBody(){ return new XmlNodeReader(body);}
这为 Email 类的用户提供了一种方式,使这些用户在需要时能够以有效的方式传递、设置和检索 Body 属性中的 XML 数据。
准则 如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。
敏锐的读者可能会注意到,如果您直接将 XmlDocument 作为属性公开,则应满足该准则,还应使该属性的用户可以精确更改 XML。
返回页首
方法可以接受 XML 输入或者返回 XML 作为输出
当设计生成或使用 XML 的方法时,开发人员有责任使这样的方法在接受输入时具有灵活性。当方法接受 XML 作为输入时,您可以将这些方法分为要求在适当位置修改数据的方法,以及只需对 XML 进行只读访问的方法。唯一一个支持读写访问的“XML 常见疑点”是 XmlDocument。下面的代码示例显示了这样一个方法:
public void ApplyDiscount(XmlDocument priceList){ foreach(XmlElement price in priceList.SelectNodes("//price")){price.InnerText = (Double.Parse(price.InnerText) * 0.85).ToString(); }}
对于需要对 XML 进行只读访问的方法,有两个主要选项:
• XmlReader
• XPathNavigator
XmlReader 提供了对 XML 的只进访问,而 XPathNavigator 不但提供了对基本 XML 源的随机访问,还提供了对数据源执行 XPath 查询的能力。以下代码示例将打印下面的 XML 文档中的 artist(艺术家)和 title(标题):
<items> <compact-disc><price>16.95</price><artist>Nelly</artist><title>Nellyville</title> </compact-disc> <compact-disc><price>17.55</price> <artist>Baby D</artist> <title>Lil Chopper Toy</title> </compact-disc></items>
XmlReader:
public static void PrintArtistAndPrice(XmlReader reader){ reader.MoveToContent(); //move from root node to document element (items) /* 保持读取,直至获得第一个 <artist> 元素 */ while(reader.Read()){if((reader.NodeType == XmlNodeType.Element) && reader.Name.Equals("artist")){artist = reader.ReadElementString();title= reader.ReadElementString();break; } } Console.WriteLine("Artist={0}, Title={1}", artist, title);}}
XPathNavigator:
public static void PrintArtistAndPrice(XPathNavigator nav){ XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist /items/compact-disc[1]/title"); iterator.MoveNext(); Console.WriteLine("Artist={0}", iterator.Current); iterator.MoveNext(); Console.WriteLine("Title={0}", iterator.Current);}
通常,返回 XML 的方法都使用类似的规则。如果希望接收方编辑 XML,则应返回 XmlDocument。否则,应根据方法是否需要提供对 XML 数据的只进流式访问而返回 XmlReader 或 XPathNavigator。
准则 接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。
上述准则的意思是指返回 XML 的方法应有助于返回 XmlReader,因为它比其他任何类型都适用于更多用户的情况。此外,当方法的调用方需要更多功能时,它们可以从返回的 XmlReader 加载 XmlDocument 或 XPathDocument。
返回页首
将对象转换为 XML
XML 作为信息交换的通用语言已无所不在,这使其成为要以 XML 表示自身的某些对象的显而易见的选择,这些对象或者是出于序列化目的,或者是为了获得对其他 XML 技术的访问(如使用 XPath 进行查询或使用 XSLT 进行转换)。
当出于序列化目的将对象转换成 XML 时,显然应选择使用 XML Serialization technology in the .NET Framework(英文)。但是,在某些情况下,您对生成的 XML 所需的控制可能比 XmlSerializer 所能提供的更多。在这种情况下,工具包中的 XmlWriter 便是一个很有用的类,因为它使您不再需要该类的结构与所生成的 XML 之间存在一对一映射。下例显示了通过使用 XmlWriter 序列化 Email 类(前面几部分中已经提到)而生成的 XML。
public void Save(XmlWriter writer){ writer.WriteStartDocument();writer.WriteStartElement("email");writer.WriteStartElement("headers"); writer.WriteStartElement("header"); write
使用字符串作为表示 XML 文档的字段或属性的主要表示方式是最具用户友好性的表示方式,因为 System.String 类是一般开发人员最熟悉的 XML“常见疑点”。但是,这将会增加使用该类的用户的负担,这些用户现在可能必须应付两次分析 XML 文档的成本。例如,设想一种情况:在从 SqlCommand.ExecuteXmlReader() method(英文)或 XslTransform.Transform() method(英文)所得到的 XML 中设置了这样一个属性。在这种情况下,用户将必须分析文档两次,如下例所示:
Email email= new Email();email.From = "dareo@example.com";email.To= "michealb@example.org";email.Subject = "Hello World";XslTransform transform = new XslTransform();transform.Load("format-body.xsl");XmlDocument body = new XmlDocument();//1. XML 由 XmlDocument.Load() 分析 body.Load(transform.Transform(new XPathDocument("body.xml"), null)); //2. 同一 XML 被 Email.Body 属性中的 XmlDocument.Load() 再次分析email.Body = body.OuterXml;
在上例中,同一 XML 被分析了两次,因为在将该 XML 转换成字符串之前必须将其从 XmlReader 加载到 XmlDocument 中,然后使用该 XML 设置 Email 类的 Body 属性,再由该属性本身从内部将该 XML 分析为 XmlDocument。一条很有效的经验法则就是提供对 XML 属性的访问(作为 XmlReader 和字符串)。因此,还应将下列方法添加到 Email 类,以使该类的用户获得最大的灵活性:
public void SetBody(XmlReader reader){ body.Load(reader);}public XmlReader GetBody(){ return new XmlNodeReader(body);}
这为 Email 类的用户提供了一种方式,使这些用户在需要时能够以有效的方式传递、设置和检索 Body 属性中的 XML 数据。
准则 如果类的字段或属性是 XML 文档或片段,则该类应提供将其属性同时作为字符串和 XmlReader 进行操作的机制。
敏锐的读者可能会注意到,如果您直接将 XmlDocument 作为属性公开,则应满足该准则,还应使该属性的用户可以精确更改 XML。
返回页首
方法可以接受 XML 输入或者返回 XML 作为输出
当设计生成或使用 XML 的方法时,开发人员有责任使这样的方法在接受输入时具有灵活性。当方法接受 XML 作为输入时,您可以将这些方法分为要求在适当位置修改数据的方法,以及只需对 XML 进行只读访问的方法。唯一一个支持读写访问的“XML 常见疑点”是 XmlDocument。下面的代码示例显示了这样一个方法:
public void ApplyDiscount(XmlDocument priceList){ foreach(XmlElement price in priceList.SelectNodes("//price")){price.InnerText = (Double.Parse(price.InnerText) * 0.85).ToString(); }}
对于需要对 XML 进行只读访问的方法,有两个主要选项:
• XmlReader
• XPathNavigator
XmlReader 提供了对 XML 的只进访问,而 XPathNavigator 不但提供了对基本 XML 源的随机访问,还提供了对数据源执行 XPath 查询的能力。以下代码示例将打印下面的 XML 文档中的 artist(艺术家)和 title(标题):
<items> <compact-disc><price>16.95</price><artist>Nelly</artist><title>Nellyville</title> </compact-disc> <compact-disc><price>17.55</price> <artist>Baby D</artist> <title>Lil Chopper Toy</title> </compact-disc></items>
XmlReader:
public static void PrintArtistAndPrice(XmlReader reader){ reader.MoveToContent(); //move from root node to document element (items) /* 保持读取,直至获得第一个 <artist> 元素 */ while(reader.Read()){if((reader.NodeType == XmlNodeType.Element) && reader.Name.Equals("artist")){artist = reader.ReadElementString();title= reader.ReadElementString();break; } } Console.WriteLine("Artist={0}, Title={1}", artist, title);}}
XPathNavigator:
public static void PrintArtistAndPrice(XPathNavigator nav){ XPathNodeIterator iterator = nav.Select("/items/compact-disc[1]/artist /items/compact-disc[1]/title"); iterator.MoveNext(); Console.WriteLine("Artist={0}", iterator.Current); iterator.MoveNext(); Console.WriteLine("Title={0}", iterator.Current);}
通常,返回 XML 的方法都使用类似的规则。如果希望接收方编辑 XML,则应返回 XmlDocument。否则,应根据方法是否需要提供对 XML 数据的只进流式访问而返回 XmlReader 或 XPathNavigator。
准则 接受或返回 XML 的方法应有助于返回 XmlReader 或 XPathNavigator,除非用户希望能够编辑 XML 数据(此时应使用 XmlDocument)。
上述准则的意思是指返回 XML 的方法应有助于返回 XmlReader,因为它比其他任何类型都适用于更多用户的情况。此外,当方法的调用方需要更多功能时,它们可以从返回的 XmlReader 加载 XmlDocument 或 XPathDocument。
返回页首
将对象转换为 XML
XML 作为信息交换的通用语言已无所不在,这使其成为要以 XML 表示自身的某些对象的显而易见的选择,这些对象或者是出于序列化目的,或者是为了获得对其他 XML 技术的访问(如使用 XPath 进行查询或使用 XSLT 进行转换)。
当出于序列化目的将对象转换成 XML 时,显然应选择使用 XML Serialization technology in the .NET Framework(英文)。但是,在某些情况下,您对生成的 XML 所需的控制可能比 XmlSerializer 所能提供的更多。在这种情况下,工具包中的 XmlWriter 便是一个很有用的类,因为它使您不再需要该类的结构与所生成的 XML 之间存在一对一映射。下例显示了通过使用 XmlWriter 序列化 Email 类(前面几部分中已经提到)而生成的 XML。
public void Save(XmlWriter writer){ writer.WriteStartDocument();writer.WriteStartElement("email");writer.WriteStartElement("headers"); writer.WriteStartElement("header"); write
