一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点

前端之家收集整理的这篇文章主要介绍了一个经过改良的XMLHelper(包含了序列化,反序列化,创建xml文件,读取节点前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

转自:http://www.360doc.com/content/13/0905/20/1944636_312482651.shtml


public class @H_301_22@XmlHelper
@H_301_22@{
public @H_301_22@XmlHelper()
@H_301_22@{
@H_301_22@}
public enum @H_301_22@XmlType
@H_301_22@{
@H_301_22@File,
@H_301_22@String
@H_301_22@};
/// <summary>
/// 创建XML文档
/// </summary>
/// <param name="name">根节点名称</param>
/// <param name="type">根节点的一个属性值</param>
/// <returns></returns>
/// .net中调用方法:写入文件中,则:
/// document = XmlOperate.CreateXmlDocument("sex","sexy");
/// document.Save("c:/bookstore.xml");
public static @H_301_22@XmlDocument CreateXmlDocument( string @H_301_22@name,string @H_301_22@type )
@H_301_22@{
@H_301_22@XmlDocument doc = null@H_301_22@;
@H_301_22@XmlElement rootEle = null@H_301_22@;
try
@H_301_22@{
@H_301_22@doc = new @H_301_22@XmlDocument();
@H_301_22@doc.LoadXml( "<" @H_301_22@+ name + "/>" @H_301_22@);
@H_301_22@rootEle = doc.DocumentElement;
@H_301_22@rootEle.SetAttribute( "type"@H_301_22@,type );
@H_301_22@}
catch @H_301_22@(Exception er)
@H_301_22@{
throw @H_301_22@er;
@H_301_22@}
return @H_301_22@doc;
@H_301_22@}
/// <summary>
/// 读取数据
/// </summary>
/// <param name="path">路径</param>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时返回该属性值,否则返回串联值</param>
/// <returns>string</returns>
/**************************************************
* 使用示列:
* XmlHelper.Read(path,"/Node","")
* XmlHelper.Read(path,"/Node/Element[@Attribute='Name']","Attribute")
************************************************/
public static string @H_301_22@Read( string @H_301_22@path,string @H_301_22@node,string @H_301_22@attribute )
@H_301_22@{
string @H_301_22@value = ""@H_301_22@;
try
@H_301_22@{
@H_301_22@XmlDocument doc = new @H_301_22@XmlDocument();
@H_301_22@doc.Load( path );
@H_301_22@XmlNode xn = doc.SelectSingleNode( node );
@H_301_22@value = (attribute.Equals( "" @H_301_22@) ? xn.InnerText : xn.Attributes[attribute].Value);
@H_301_22@}
catch @H_301_22@{ }
return @H_301_22@value;
@H_301_22@}
/// <summary>
/// 插入数据
/// </summary>
/// <param name="path">路径</param>
/// <param name="node">节点</param>
/// <param name="element">元素名,非空时插入新元素,否则在该元素中插入属性</param>
/// <param name="attribute">属性名,非空时插入该元素属性值,否则插入元素值</param>
/// <param name="value">值</param>
/// <returns></returns>
/**************************************************
* 使用示列:
* XmlHelper.Insert(path,"Element","","Value")
* XmlHelper.Insert(path,"Attribute","Value")
* XmlHelper.Insert(path,"Value")
************************************************/
public static void @H_301_22@Insert( string @H_301_22@path,string @H_301_22@element,string @H_301_22@attribute,string @H_301_22@value )
@H_301_22@{
try
@H_301_22@{
@H_301_22@XmlDocument doc = new @H_301_22@XmlDocument();
@H_301_22@doc.Load( path );
@H_301_22@XmlNode xn = doc.SelectSingleNode( node );
if @H_301_22@(element.Equals( "" @H_301_22@))
@H_301_22@{
if @H_301_22@(!attribute.Equals( "" @H_301_22@))
@H_301_22@{
@H_301_22@XmlElement xe = (XmlElement)xn;
@H_301_22@xe.SetAttribute( attribute,value );
@H_301_22@}
@H_301_22@}
else
@H_301_22@{
@H_301_22@XmlElement xe = doc.CreateElement( element );
if @H_301_22@(attribute.Equals( "" @H_301_22@))
@H_403_926@ @H_301_22@xe.InnerText = value;
else
@H_301_22@xe.SetAttribute( attribute,value );
@H_301_22@xn.AppendChild( xe );
@H_301_22@}
@H_301_22@doc.Save( path );
@H_301_22@}
catch @H_301_22@{ }
@H_301_22@}
/// <summary>
/// 修改数据
/// </summary>
/// <param name="path">路径</param>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时修改该节点属性值,否则修改节点值</param>
/// <param name="value">值</param>
/// <returns></returns>
/**************************************************
* 使用示列:
* XmlHelper.Insert(path,"Value")
* XmlHelper.Insert(path,"Value")
************************************************/
public static void @H_301_22@Update( string @H_301_22@path,string @H_301_22@value )
@H_301_22@{
try
@H_301_22@{
@H_301_22@XmlDocument doc = new @H_301_22@XmlDocument();
@H_301_22@doc.Load( path );
@H_301_22@XmlNode xn = doc.SelectSingleNode( node );
@H_301_22@XmlElement xe = (XmlElement)xn;
if @H_301_22@(attribute.Equals( "" @H_301_22@))
@H_301_22@xe.InnerText = value;
else
@H_301_22@xe.SetAttribute( attribute,value );
@H_301_22@doc.Save( path );
@H_301_22@}
catch @H_301_22@{ }
@H_301_22@}
@H_404_1262@
/// <summary>
/// 删除数据
/// </summary>
/// <param name="path">路径</param>
/// <param name="node">节点</param>
/// <param name="attribute">属性名,非空时删除该节点属性值,否则删除节点值</param>
/// <param name="value">值</param>
/// <returns></returns>
/**************************************************
* 使用示列:
* XmlHelper.Delete(path,"")
* XmlHelper.Delete(path,"Attribute")
************************************************/
public static void @H_301_22@Delete( string @H_301_22@path,string @H_301_22@attribute )
@H_301_22@{
try
@H_301_22@{
@H_301_22@XmlDocument doc = new @H_301_22@XmlDocument();
@H_301_22@doc.Load( path );
@H_301_22@XmlNode xn = doc.SelectSingleNode( node );
@H_301_22@XmlElement xe = (XmlElement)xn;
if @H_301_22@(attribute.Equals( "" @H_301_22@))
@H_301_22@xn.ParentNode.RemoveChild( xn );
else
@H_301_22@xe.RemoveAttribute( attribute );
@H_301_22@doc.Save( path );
@H_301_22@}
catch @H_301_22@{ }
@H_301_22@}
#region 读取XML资源到DataSet中
/// <summary>
/// 读取XML资源到DataSet中
/// </summary>
/// <param name="source">XML资源,文件为路径,否则为XML字符串</param>
/// <param name="xmlType">XML资源类型</param>
/// <returns>DataSet</returns>
public static @H_301_22@DataSet GetDataSet( string @H_301_22@source,XmlType xmlType )
@H_301_22@{
@H_301_22@DataSet ds = new @H_301_22@DataSet();
if @H_301_22@(xmlType == XmlType.File)
@H_301_22@{
@H_301_22@ds.ReadXml( source );
@H_301_22@}
else
@H_301_22@{
@H_301_22@XmlDocument xd = new @H_301_22@XmlDocument();
@H_301_22@xd.LoadXml( source );
@H_301_22@XmlNodeReader xnr = new @H_301_22@XmlNodeReader( xd );
@H_301_22@ds.ReadXml( xnr );
@H_301_22@}
return @H_301_22@ds;
@H_301_22@}
#endregion
#region 操作xml文件中指定节点的数据
/// <summary>
/// 获得xml文件中指定节点的节点数据
/// </summary>
/// <param name="TableName"></param>
/// <returns></returns>
public static string @H_301_22@GetNodeInfoByNodeName( string @H_301_22@path,string @H_301_22@nodeName )
@H_301_22@{
string @H_301_22@XmlString = ""@H_301_22@;
@H_301_22@XmlDocument xml = new @H_301_22@XmlDocument();
@H_301_22@xml.Load( path );
@H_301_22@System.Xml.XmlElement root = xml.DocumentElement;
@H_301_22@System.Xml.XmlNode node = root.SelectSingleNode( "//" @H_301_22@+ nodeName );
if @H_301_22@(node != null@H_301_22@)
@H_301_22@{
@H_301_22@XmlString = node.InnerText;
@H_301_22@}
return @H_301_22@XmlString;
@H_301_22@}
#endregion
#region 获取一个字符串xml文档中的ds
/// <summary>
/// 获取一个字符串xml文档中的ds
/// </summary>
/// <param name="xml_string">含有xml信息的字符串</param>
public static void @H_301_22@get_XmlValue_ds( string @H_301_22@xml_string,ref @H_301_22@DataSet ds )
@H_301_22@{
@H_301_22@System.Xml.XmlDocument xd = new @H_301_22@XmlDocument();
@H_301_22@xd.LoadXml( xml_string );
@H_301_22@XmlNodeReader xnr = new @H_301_22@XmlNodeReader( xd );
@H_301_22@ds.ReadXml( xnr );
@H_301_22@xnr.Close();
int @H_301_22@a = ds.Tables.Count;
@H_301_22@}
#endregion
#region 读取XML资源到DataTable中
/// <summary>
/// 读取XML资源到DataTable中
/// </summary>
/// <param name="source">XML资源,文件为路径,否则为XML字符串</param>
/// <param name="xmlType">XML资源类型:文件,字符串</param>
/// <param name="tableName">表名称</param>
/// <returns>DataTable</returns>
public static @H_301_22@DataTable GetTable( string @H_301_22@source,XmlType xmlType,string @H_301_22@tableName )
@H_301_22@{
@H_301_22@DataSet ds = new @H_301_22@DataSet();
if @H_301_22@(xmlType == XmlType.File)
@H_301_22@{
@H_301_22@ds.ReadXml( source );
@H_301_22@}
else
@H_301_22@{
@H_301_22@XmlDocument xd = new @H_301_22@XmlDocument();
@H_301_22@xd.LoadXml( source );
@H_301_22@XmlNodeReader xnr = new @H_301_22@XmlNodeReader( xd );
@H_301_22@ds.ReadXml( xnr );
@H_301_22@}
return @H_301_22@ds.Tables[tableName];
@H_301_22@}
#endregion
#region 读取XML资源中指定的DataTable的指定行指定列的值
/// <summary>
/// 读取XML资源中指定的DataTable的指定行指定列的值
/// </summary>
/// <param name="source">XML资源</param>
/// <param name="xmlType">XML资源类型:文件,字符串</param>
/// <param name="tableName">表名</param>
/// <param name="rowIndex">行号</param>
/// <param name="colName">列名</param>
/// <returns>值,不存在时返回Null</returns>
public static object @H_301_22@GetTableCell( string @H_301_22@source,string @H_301_22@tableName,int @H_301_22@rowIndex,string @H_301_22@colName )
@H_301_22@{
@H_301_22@DataSet ds = new @H_301_22@DataSet();
if @H_301_22@(xmlType == XmlType.File)
@H_301_22@{
@H_301_22@ds.ReadXml( source );
@H_301_22@}
else
@H_301_22@{
@H_301_22@XmlDocument xd = new @H_301_22@XmlDocument();
@H_301_22@xd.LoadXml( source );
@H_301_22@XmlNodeReader xnr = new @H_301_22@XmlNodeReader( xd );
@H_301_22@ds.ReadXml( xnr );
@H_301_22@}
return @H_301_22@ds.Tables[tableName].Rows[rowIndex][colName];
@H_301_22@}
#endregion
#region 读取XML资源中指定的DataTable的指定行指定列的值
/// <summary>
/// 读取XML资源中指定的DataTable的指定行指定列的值
/// </summary>
/// <param name="source">XML资源</param>
/// <param name="xmlType">XML资源类型:文件,字符串</param>
/// <param name="tableName">表名</param>
/// <param name="rowIndex">行号</param>
/// <param name="colIndex">列号</param>
/// <returns>值,不存在时返回Null</returns>
public static object @H_301_22@GetTableCell( string @H_301_22@source,int @H_301_22@colIndex )
@H_301_22@{
@H_301_22@DataSet ds = new @H_301_22@DataSet();
if @H_301_22@(xmlType == XmlType.File)
@H_301_22@{
@H_301_22@ds.ReadXml( source );
@H_301_22@}
else
@H_301_22@{
@H_301_22@XmlDocument xd = new @H_301_22@XmlDocument();
@H_301_22@xd.LoadXml( source );
@H_301_22@XmlNodeReader xnr = new @H_301_22@XmlNodeReader( xd );
@H_301_22@ds.ReadXml( xnr );
@H_301_22@}
return @H_301_22@ds.Tables[tableName].Rows[rowIndex][colIndex];
@H_403_2816@ @H_301_22@}
#endregion
#region 将DataTable写入XML文件
/// <summary>
/// 将DataTable写入XML文件
/// </summary>
/// <param name="dt">含有数据的DataTable</param>
/// <param name="filePath">文件路径</param>
public static void @H_301_22@SaveTableToFile( DataTable dt,string @H_301_22@filePath )
@H_301_22@{
@H_301_22@DataSet ds = new @H_301_22@DataSet( "Config" @H_301_22@);
@H_301_22@ds.Tables.Add( dt.Copy() );
@H_301_22@ds.WriteXml( filePath );
@H_301_22@}
#endregion
#region 将DataTable以指定的根结点名称写入文件
/// <summary>
/// 将DataTable以指定的根结点名称写入文件
/// </summary>
/// <param name="dt">含有数据的DataTable</param>
/// <param name="rootName">根结点名称</param>
@H_864_3010@ /// <param name="filePath">文件路径</param>
@H_720_3018@ public static void @H_301_22@SaveTableToFile( DataTable dt,string @H_301_22@rootName,string @H_301_22@filePath )
@H_301_22@{
@H_301_22@DataSet ds = new @H_301_22@DataSet( rootName );
@H_301_22@ds.Tables.Add( dt.Copy() );
@H_301_22@ds.WriteXml( filePath );
@H_301_22@}
#endregion
#region 使用DataSet方式更新XML文件节点
/// <summary>
/// 使用DataSet方式更新XML文件节点
/// </summary>
/// <param name="filePath">XML文件路径</param>
/// <param name="tableName">表名称</param>
/// <param name="rowIndex">行号</param>
/// <param name="colName">列名</param>
/// <param name="content">更新值</param>
/// <returns>更新是否成功</returns>
public static bool @H_301_22@UpdateTableCell( string @H_301_22@filePath,string @H_301_22@colName,string @H_301_22@content )
@H_301_22@{
bool @H_301_22@flag = false@H_301_22@;
@H_301_22@DataSet ds = new @H_301_22@DataSet();
@H_301_22@ds.ReadXml( filePath );
@H_301_22@DataTable dt = ds.Tables[tableName];
if @H_301_22@(dt.Rows[rowIndex][colName] != null@H_301_22@)
@H_301_22@{
@H_301_22@dt.Rows[rowIndex][colName] = content;
@H_301_22@ds.WriteXml( filePath );
@H_301_22@flag = true@H_301_22@;
@H_301_22@}
else
@H_301_22@{
@H_301_22@flag = false@H_301_22@;
@H_301_22@}
return @H_301_22@flag;
@H_301_22@}
#endregion
#region 使用DataSet方式更新XML文件节点
/// <summary>
/// 使用DataSet方式更新XML文件节点
@H_530_3404@ /// </summary>
/// <param name="filePath">XML文件路径</param>
/// <param name="tableName">表名称</param>
/// <param name="rowIndex">行号</param>
/// <param name="colIndex">列号</param>
/// <param name="content">更新值</param>
/// <returns>更新是否成功</returns>
public static bool @H_301_22@UpdateTableCell( string @H_301_22@filePath,int @H_301_22@colIndex,string @H_301_22@content )
@H_301_22@{
bool @H_301_22@flag = false@H_301_22@;
@H_301_22@DataSet ds = new @H_301_22@DataSet();
@H_301_22@ds.ReadXml( filePath );
@H_301_22@DataTable dt = ds.Tables[tableName];
if @H_301_22@(dt.Rows[rowIndex][colIndex] != null@H_301_22@)
@H_301_22@{
@H_301_22@dt.Rows[rowIndex][colIndex] = content;
@H_301_22@ds.WriteXml( filePath );
@H_301_22@flag = true@H_301_22@;
@H_301_22@}
else
@H_301_22@{
@H_301_22@flag = false@H_301_22@;
@H_301_22@}
return @H_301_22@flag;
@H_301_22@}
#endregion
#region 读取XML资源中的指定节点内容
/// <summary>
/// 读取XML资源中的指定节点内容
/// </summary>
/// <param name="source">XML资源</param>
/// <param name="xmlType">XML资源类型:文件,字符串</param>
/// <param name="nodeName">节点名称</param>
/// <returns>节点内容</returns>
public static object @H_301_22@GetNodeValue( string @H_301_22@source,string @H_301_22@nodeName )
@H_301_22@{
@H_301_22@XmlDocument xd = new @H_301_22@XmlDocument();
if @H_301_22@(xmlType == XmlType.File)
@H_301_22@{
@H_301_22@xd.Load( source );
@H_301_22@}
else
@H_301_22@{
@H_301_22@xd.LoadXml( source );
@H_301_22@}
@H_301_22@XmlElement xe = xd.DocumentElement;
@H_301_22@XmlNode xn = xe.SelectSingleNode( "//" @H_301_22@+ nodeName );
if @H_301_22@(xn != null@H_301_22@)
@H_301_22@{
return @H_301_22@xn.InnerText;
@H_301_22@}
else
@H_301_22@{
return null@H_301_22@;
@H_301_22@}
@H_301_22@}
/// <summary>
@H_502_3956@ /// 读取XML资源中的指定节点内容
/// </summary>
/// <param name="source">XML资源</param>
/// <param name="nodeName">节点名称</param>
/// <returns>节点内容</returns>
public static object @H_301_22@GetNodeValue( string @H_301_22@source,string @H_301_22@nodeName )
@H_301_22@{
if @H_301_22@(source == null @H_301_22@|| nodeName == null @H_301_22@|| source == "" @H_301_22@|| nodeName == "" @H_301_22@|| source.Length < nodeName.Length * 2)
@H_301_22@{
return null@H_301_22@;
@H_301_22@}
else
@H_301_22@{
int @H_301_22@start = source.IndexOf( "<" @H_301_22@+ nodeName + ">" @H_301_22@) + nodeName.Length + 2;
int @H_301_22@end = source.IndexOf( "</" @H_301_22@+ nodeName + ">" @H_301_22@);
if @H_301_22@(start == -1 || end == -1)
@H_301_22@{
return null@H_301_22@;
@H_301_22@}
else if @H_301_22@(start >= end)
@H_301_22@{
return null@H_301_22@;
@H_301_22@}
else
@H_301_22@{
return @H_301_22@source.Substring( start,end - start );
@H_301_22@}
@H_301_22@}
@H_301_22@}
#endregion
#region 更新XML文件中的指定节点内容
/// <summary>
/// 更新XML文件中的指定节点内容
/// </summary>
/// <param name="filePath">文件路径</param>
/// <param name="nodeName">节点名称</param>
/// <param name="nodeValue">更新内容</param>
/// <returns>更新是否成功</returns>
public static bool @H_301_22@UpdateNode( string @H_301_22@filePath,string @H_301_22@nodeName,string @H_301_22@nodeValue )
@H_301_22@{
bool @H_301_22@flag = false@H_301_22@;
@H_301_22@XmlDocument xd = new @H_301_22@XmlDocument();
@H_301_22@xd.Load( filePath );
@H_301_22@XmlElement xe = xd.DocumentElement;
@H_301_22@XmlNode xn = xe.SelectSingleNode( "//" @H_301_22@+ nodeName );
if @H_301_22@(xn != null@H_301_22@)
@H_301_22@{
@H_301_22@xn.InnerText = nodeValue;
@H_301_22@flag = true@H_301_22@;
@H_301_22@}
else
@H_301_22@{
@H_301_22@flag = false@H_301_22@;
@H_301_22@}
return @H_301_22@flag;
@H_301_22@}
#endregion
/// <summary>
/// 读取xml文件,并将文件序列化为类
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="path"></param>
/// <returns></returns>
public static @H_301_22@T ReadXML<T>( string @H_301_22@path )
@H_301_22@{
@H_301_22@XmlSerializer reader = new @H_301_22@XmlSerializer( typeof@H_301_22@( JJDB ) );
@H_301_22@StreamReader file = new @H_301_22@StreamReader( @path );
return @H_301_22@(T)reader.Deserialize( file );
@H_301_22@}
/// <summary>
/// 将对象写入XML文件
/// </summary>
/// <typeparam name="T">C#对象名</typeparam>
/// <param name="item">对象实例</param>
/// <param name="path">路径</param>
/// <param name="jjdbh">标号</param>
/// <param name="ends">结束符号(整个xml的路径类似如下:C:\xmltest\201111send.xml,其中path=C:\xmltest,jjdbh=201111,ends=send)</param>
/// <returns></returns>
public static string @H_301_22@WriteXML<T>( T item,string @H_301_22@path,string @H_301_22@jjdbh,string @H_301_22@ends )
@H_301_22@{
if @H_301_22@(string@H_301_22@.IsNullOrEmpty( ends ))
@H_301_22@{
//默认为发送
@H_301_22@ends = "send"@H_301_22@;
@H_301_22@}
int @H_301_22@i = 0;//控制写入文件次数
@H_301_22@XmlSerializer serializer = new @H_301_22@XmlSerializer( item.GetType() );
object@H_301_22@[] obj = new object@H_301_22@[] { path,"\\"@H_301_22@,jjdbh,ends,".xml" @H_301_22@};
string @H_301_22@xmlPath = String.Concat( obj );
while @H_301_22@(true@H_301_22@)
@H_301_22@{
try
@H_301_22@{
//用filestream方式创建文件不会出现“文件正在占用中,用File.create”则不行
@H_301_22@FileStream fs;
@H_301_22@fs = File.Create( xmlPath );
@H_301_22@fs.Close();
@H_301_22@TextWriter writer = new @H_301_22@StreamWriter( xmlPath,false@H_301_22@,Encoding.UTF8 );
@H_301_22@XmlSerializerNamespaces xml = new @H_301_22@XmlSerializerNamespaces();
@H_301_22@xml.Add( string@H_301_22@.Empty,string@H_301_22@.Empty );
@H_301_22@serializer.Serialize( writer,item,xml );
@H_301_22@writer.Flush();
@H_301_22@writer.Close();
@H_748_5022@ break@H_301_22@;
@H_301_22@}
catch @H_301_22@(Exception exec)
@H_301_22@{
if @H_301_22@(i < 5)
@H_301_22@{
@H_301_22@i++;
continue@H_301_22@;
@H_301_22@}
else
@H_301_22@{ break@H_301_22@; }
@H_301_22@}
@H_301_22@}
return @H_301_22@SerializeToXmlStr<T>( item,true @H_301_22@);
@H_301_22@}
/// <summary>
/// 静态扩展
/// </summary>
/// <typeparam name="T">需要序列化的对象类型,必须声明[Serializable]特征</typeparam>
/// <param name="obj">需要序列化的对象</param>
/// <param name="omitXmlDeclaration">true:省略XML声明;否则为false.默认false,即编写 XML 声明。</param>
/// <returns></returns>
public static string @H_301_22@SerializeToXmlStr<T>( T obj,bool @H_301_22@omitXmlDeclaration )
@H_301_22@{
return @H_301_22@XmlSerialize<T>( obj,omitXmlDeclaration );
@H_301_22@}
#region XML序列化反序列化相关的静态方法
/// <summary>
/// 使用XmlSerializer序列化对象
/// </summary>
/// <typeparam name="T">需要序列化的对象类型,必须声明[Serializable]特征</typeparam>
/// <param name="obj">需要序列化的对象</param>
/// <param name="omitXmlDeclaration">true:省略XML声明;否则为false.默认false,即编写 XML 声明。</param>
/// <returns>序列化后的字符串</returns>
public static string @H_301_22@XmlSerialize<T>( T obj,bool @H_301_22@omitXmlDeclaration )
@H_301_22@{
/* This property only applies to XmlWriter instances that output text content to a stream; otherwise,this setting is ignored.
可能很多朋友遇见过 不能转换成Xml不能反序列化成为UTF8XML声明的情况,就是这个原因。
*/
@H_301_22@XmlWriterSettings xmlSettings = new @H_301_22@XmlWriterSettings();
@H_301_22@xmlSettings.OmitXmlDeclaration = omitXmlDeclaration;
@H_301_22@xmlSettings.Encoding = new @H_301_22@System.Text.UTF8Encoding( false @H_301_22@);
@H_301_22@MemoryStream stream = new @H_301_22@MemoryStream();//var writer = new StringWriter();
@H_301_22@XmlWriter xmlwriter = XmlWriter.Create( stream/*writer*/@H_301_22@,xmlSettings ); //这里如果直接写成:Encoding = Encoding.UTF8 会在生成的xml中加入BOM(Byte-order Mark) 信息(Unicode 字节顺序标记) , 所以new System.Text.UTF8Encoding(false)是最佳方式,省得再做替换的麻烦
@H_301_22@XmlSerializerNamespaces xmlns = new @H_301_22@XmlSerializerNamespaces();
@H_301_22@xmlns.Add( String.Empty,String.Empty ); //在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
@H_301_22@XmlSerializer ser = new @H_301_22@XmlSerializer( typeof@H_301_22@( T ) );
@H_301_22@ser.Serialize( xmlwriter,obj,xmlns );
return @H_301_22@Encoding.UTF8.GetString( stream.ToArray() );//writer.ToString();
@H_301_22@}
/// <summary>
/// 使用XmlSerializer序列化对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="path">文件路径</param>
/// <param name="obj">需要序列化的对象</param>
/// <param name="omitXmlDeclaration">true:省略XML声明;否则为false.默认false,即编写 XML 声明。</param>
/// <param name="removeDefaultNamespace">是否移除默认名称空间(如果对象定义时指定了:XmlRoot(Namespace = "http://www.xxx.com/xsd")则需要传false值进来)</param>
/// <returns>序列化后的字符串</returns>
public static void @H_301_22@XmlSerialize<T>( string @H_301_22@path,T obj,bool @H_301_22@omitXmlDeclaration,bool @H_301_22@removeDefaultNamespace )
@H_301_22@{
@H_301_22@XmlWriterSettings xmlSetings = new @H_301_22@XmlWriterSettings();
@H_301_22@xmlSetings.OmitXmlDeclaration = omitXmlDeclaration;
using @H_301_22@(XmlWriter xmlwriter = XmlWriter.Create( path,xmlSetings ))
@H_301_22@{
@H_301_22@XmlSerializerNamespaces xmlns = new @H_301_22@XmlSerializerNamespaces();
if @H_301_22@(removeDefaultNamespace)
@H_301_22@xmlns.Add( String.Empty,String.Empty ); //在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
@H_301_22@XmlSerializer ser = new @H_301_22@XmlSerializer( typeof@H_301_22@( T ) );
@H_301_22@ser.Serialize( xmlwriter,xmlns );
@H_301_22@}
@H_301_22@}
private static byte@H_301_22@[] ShareReadFile( string @H_301_22@filePath )
@H_301_22@{
byte@H_301_22@[] bytes;
//避免"正由另一进程使用,因此该进程无法访问此文件"造成异常 共享锁 flieShare必须为ReadWrite,但是如果文件不存在的话,还是会出现异常,所以这里不能吃掉任何异常,但是需要考虑到这些问题
using @H_301_22@(FileStream fs = new @H_301_22@FileStream( filePath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite ))
@H_301_22@{
@H_301_22@bytes = new byte@H_301_22@[fs.Length];
int @H_301_22@numBytesToRead = (int@H_301_22@)fs.Length;
int @H_301_22@numBytesRead = 0;
while @H_301_22@(numBytesToRead > 0)
@H_301_22@{
int @H_301_22@n = fs.Read( bytes,numBytesRead,numBytesToRead );
if @H_301_22@(n == 0)
@H_403_5886@ break@H_301_22@;
@H_301_22@numBytesRead += n;
@H_301_22@numBytesToRead -= n;
@H_301_22@}
@H_301_22@}
return @H_301_22@bytes;
@H_301_22@}
/// <summary>
/// 从文件读取并反序列化为对象 (解决: 多线程或多进程下读写并发问题)
/// </summary>
/// <typeparam name="T">返回的对象类型</typeparam>
/// <param name="path">文件地址</param>
/// <returns></returns>
public static @H_301_22@T XmlFileDeserialize<T>( string @H_301_22@path )
@H_301_22@{
byte@H_301_22@[] bytes = ShareReadFile( path );
if @H_301_22@(bytes.Length < 1)//当文件正在被写入数据时,可能读出为0
for @H_301_22@(int @H_301_22@ i = 0; i < 5; i++)
@H_301_22@{ //5次机会
@H_301_22@bytes = ShareReadFile( path ); // 采用这样诡异的做法避免独占文件文件正在被写入时读出来的数据为0字节的问题。
if @H_301_22@(bytes.Length > 0) break@H_301_22@;
@H_301_22@System.Threading.Thread.Sleep( 50 ); //悲观情况下总共最多消耗1/4秒,读取文件
@H_301_22@}
@H_301_22@XmlDocument doc = new @H_301_22@XmlDocument();
@H_301_22@doc.Load( new @H_301_22@MemoryStream( bytes ) );
if @H_301_22@(doc.DocumentElement != null@H_301_22@)
return @H_301_22@(T)new @H_301_22@ XmlSerializer( typeof@H_301_22@( T ) ).Deserialize( new @H_301_22@XmlNodeReader( doc.DocumentElement ) );
return default@H_301_22@( T );
@H_301_22@XmlReaderSettings xmlReaderSettings = new @H_301_22@XmlReaderSettings();
@H_301_22@xmlReaderSettings.CloseInput = true@H_301_22@;
using @H_301_22@(XmlReader xmlReader = XmlReader.Create( path,xmlReaderSettings ))
@H_301_22@{
@H_301_22@T obj = (T)new @H_301_22@XmlSerializer( typeof@H_301_22@( T ) ).Deserialize( xmlReader );
return @H_301_22@obj;
@H_301_22@}
@H_301_22@}
/// <summary>
/// 使用XmlSerializer反序列化对象
/// </summary>
/// <param name="xmlOfObject">需要反序列化的xml字符串</param>
/// <returns>反序列化后的对象</returns>
public static @H_301_22@T XmlDeserialize<T>( string @H_301_22@xmlOfObject ) where T : class
@H_301_22@{
@H_301_22@XmlReader xmlReader = XmlReader.Create( new @H_301_22@StringReader( xmlOfObject ),new @H_301_22@XmlReaderSettings() );
return @H_301_22@(T)new @H_301_22@ XmlSerializer( typeof@H_301_22@( T ) ).Deserialize( xmlReader );
@H_301_22@}
#endregion
@H_301_22@}

猜你在找的XML相关文章