注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

采用 LINQ to XML 实现 IXmlSerializable  

2013-03-21 10:25:05|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
采用 LINQ to XML 实现 IXmlSerializable - 秒大刀 - 秒大刀 博客

    通过XML序列化可方便的将对象和XML进行映射,通常直接采用相应的Attribute即可满足一般需求,但高级应用仍需IXmlSerializable协助。

    IXmlSerializable中的WriteXml是基于XmlWriter操作的,ReadXml是基于XmlReader操作的。序列化操作可以轻松完成,而基于SAX模型的反序列化操作实现起来却很复杂。那有没有好用的DOM模型来处理这个问题呢?欢迎 LINQ to XML 入场!

/// <summary>
/// 正则表达式组的过滤器
/// </summary>
/// <remarks>ref http://msdn.microsoft.com/zh-cn/library/system.xml.serialization.ixmlserializable </remarks>

public class RegexFilter : IXmlSerializable
{
public IEnumerable<Regex> MatchRegex { get; set; }
public IEnumerable<Regex> IgnoreRegex { get; set; }

public RegexFilter() { this.MatchRegex = Enumerable.Empty<Regex>(); this.IgnoreRegex = Enumerable.Empty<Regex>(); }
public RegexFilter(IEnumerable<string> matchPatterns, IEnumerable<string> ignorePatterns, RegexOptions options = RegexOptions.None)
{
this.MatchRegex = (from r in matchPatterns ?? Enumerable.Empty<string>() select new Regex(r, options)).ToArray();
this.IgnoreRegex = (from r in ignorePatterns ?? Enumerable.Empty<string>() select new Regex(r, options)).ToArray();
}

public bool IsMatch(string str)
{
if (MatchRegex.Any() == false || MatchRegex.Any(r => r.IsMatch(str)))
{
if (IgnoreRegex.Any() && IgnoreRegex.Any(r => r.IsMatch(str)))
return false;
return true;
}
return false;
}

#region IXmlSerializable 成员
public System.Xml.Schema.XmlSchema GetSchema() { return null; }

public void ReadXml(XmlReader reader)
{
var root = (XElement)XNode.ReadFrom(reader);
this.MatchRegex = (from e in root.Elements("Match") select new Regex(e.Attribute("Pattern").Value,

(RegexOptions)Enum.Parse(typeof(RegexOptions), e.Attribute("Options").Value))).ToArray();
this.IgnoreRegex = (from e in root.Elements("Ignore") select new Regex(e.Attribute("Pattern").Value,

(RegexOptions)Enum.Parse(typeof(RegexOptions), e.Attribute("Options").Value))).ToArray();
}

public void WriteXml(XmlWriter writer)
{
foreach (var r in MatchRegex ?? Enumerable.Empty<Regex>())
new XElement("Match", new XAttribute("Options", r.Options), new XAttribute("Pattern", r)).WriteTo(writer);
foreach (var r in IgnoreRegex ?? Enumerable.Empty<Regex>())
new XElement("Ignore", new XAttribute("Options", r.Options), new XAttribute("Pattern", r)).WriteTo(writer);
}
#endregion
}

跑跑看:

class Program
{
static void Main(string[] args)
{
var filter = new RegexFilter(new string[] { @"\.xml$" }, new string[] { @"^\s*<!--.*-->\s*$" });
new XmlSerializer(typeof(RegexFilter)).Serialize(Console.Out, filter);
Console.WriteLine();
}
}

输出结果如下:

<?xml version="1.0" encoding="gb2312"?>
<RegexFilter>
<Match Options="None" Pattern="\.xml$" />
<Ignore Options="None" Pattern="^\s*&lt;!--.*--&gt;\s*$" />
</RegexFilter>


参考:



  评论这张
 
阅读(1011)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017