using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
public class XMLHelper
{
#region xml serializtion;
#region serailize
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static string XmlSerialize(Object obj, Encoding encoding)
{
return XmlSerialize(obj, encoding, false);
}
public static string XmlSerialize(Object obj, Encoding encoding, bool writeFullTag)
{
#region set settings
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = false;
settings.IndentChars = string.Empty;
settings.NewLineChars = Environment.NewLine;
settings.Encoding = encoding;
settings.NamespaceHandling = NamespaceHandling.OmitDuplicates;
settings.ConformanceLevel = ConformanceLevel.Auto;
#endregion
return XmlSerialize(obj, settings, encoding, writeFullTag);
}
public static string XmlSerialize(Object obj, XmlWriterSettings settings, Encoding encoding, bool writeFullTag)
{
XmlSerializer serializer = new XmlSerializer(obj.GetType());
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, string.Empty);
XmlWriter writer = null;
using (Stream stream = new MemoryStream())
{
if (writeFullTag)
{
writer = new XmlTextWriterFull(stream, encoding);
}
else
{
writer = XmlWriter.Create(stream, settings);
}
using (StreamReader reader = new StreamReader(stream))
{
serializer.Serialize(writer, obj, ns);
stream.Position = 0;
return reader.ReadToEnd();
}
}
}
#endregion serailize
/// <summary>
/// 把对象序列化并保存到文件.
/// </summary>
/// <param name="obj">对象</param>
/// <param name="path">要保存的文件路径</param>
/// <param name="encoding">编码方式</param>
public static void XmlSerializeToFile(object obj, string path, Encoding encoding)
{
#region check arguments
if (string.IsNullOrEmpty(path))
{
throw new ArgumentNullException("path");
}
#endregion
File.WriteAllText(path, XmlSerialize(obj, encoding, true), encoding);
}
#region deserialize
/// <summary>
/// 从XML字符串中反序列化对象
/// </summary>
/// <typeparam name="T">结果对象类型</typeparam>
/// <param name="s">包含对象的XML字符串</param>
/// <param name="encoding">编码方式</param>
/// <returns>反序列化得到的对象</returns>
public static T XmlDeserialize<T>(string xmlStrings, Encoding encoding)
{
#region check arguments
if (string.IsNullOrEmpty(xmlStrings))
throw new ArgumentNullException("xmlStrings");
if (encoding == null)
throw new ArgumentNullException("encoding");
#endregion
XmlSerializer mySerializer = new XmlSerializer(typeof(T));
using (MemoryStream memoryStream = new MemoryStream(encoding.GetBytes(xmlStrings)))
{
using (StreamReader streamReader = new StreamReader(memoryStream, encoding))
{
return (T)mySerializer.Deserialize(streamReader);
}
}
}
/// <summary>
/// 对一个文件中的XML字符串反序列化。
/// </summary>
/// <typeparam name="T">结果对象类型</typeparam>
/// <param name="path">文件路径</param>
/// <param name="encoding">编码方式</param>
/// <returns>反序列化得到的对象</returns>
public static T XmlDeserializeFromFile<T>(string path, Encoding encoding)
{
#region check arguments
if (string.IsNullOrEmpty(path))
throw new ArgumentNullException("path");
if (encoding == null)
throw new ArgumentNullException("encoding");
#endregion
string xmlStrings = File.ReadAllText(path, encoding);
return XmlDeserialize<T>(xmlStrings, encoding);
}
#endregion deserialize
#endregion
}
public class XmlTextWriterFull : XmlTextWriter
{
public XmlTextWriterFull(TextWriter w)
: base(w)
{
}
public XmlTextWriterFull(Stream stream, Encoding encoding)
: base(stream, encoding)
{
}
public XmlTextWriterFull(string fileName, Encoding encoding)
: base(fileName, encoding)
{
}
public override void WriteEndElement()
{
base.WriteFullEndElement();
}
}
注:1)XmlTextWriterFull这个类为了实现序列化xml空节点为<node1></node1>这样的格式。
2) XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = false;
settings.IndentChars = string.Empty;
settings.NewLineChars = Environment.NewLine;
settings.Encoding = encoding;
settings.NamespaceHandling = NamespaceHandling.OmitDuplicates;
settings.ConformanceLevel = ConformanceLevel.Auto;
这段代码可以实现xml字符串的相关格式。
3) XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add(string.Empty, string.Empty);
这段代码可以去掉生成XML文件的默认的命名空间。
申明:部分方法参考网上相关资源。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述