Files
T-DAS/Common/XmlHelper.cs
2023-01-13 15:30:20 +08:00

487 lines
17 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Epost.Model;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
namespace Epost.Common
{
/// <summary>
/// XmlHelper XML 操作
/// </summary>
public class XmlHelper
{
#region XML
/// <summary>
/// 获取XML 内容
/// </summary>
/// <param name="load">路径XML文档</param>
/// <param name="Act">1路径2文档</param>
/// <returns></returns>
public static XmlDocument GetLoadXml(string load, int Act)
{
XmlDocument doc = new XmlDocument();
try
{
if (Act == 1)
{
doc.Load(FileHelper.GeAbsolutePath(load));
}
else if (Act == 2)
{
doc.LoadXml(load);
}
}
catch (Exception er)
{
throw er;
}
return doc;
}
#endregion
#region
/// <summary>
/// 创建一个节点 列
/// XmlDocument doc = Commonly.XmlOperating.GetLoadXml(GetXML(2), 2);
/// XmlNode root = doc.SelectSingleNode("bookstore");
/// string[] Nodetype = { "genre", "ISBN" };
/// string[] Nodetypeval = { "李赞红", "2-3631-4" };
/// XmlElement xmlent = Commonly.XmlOperating.CreateNode(doc, "book", Nodetype, Nodetypeval, ""); //创建book节点
/// XmlElement xmlent1 = Commonly.XmlOperating.CreateNode(doc, "title", null, null, "CS从入门到精通");
/// xmlent.AppendChild(xmlent1);
/// root.AppendChild(xmlent); //也可以直接添加 doc.AppendChild(xmlent)
/// doc.Save(Server.MapPath("/bookstore.xml"));
/// </summary>
/// <param name="doc">XmlDocument</param>
/// <param name="NodeName">节点名称</param>
/// <param name="Nodetype">节点属性类型</param>
/// <param name="NodetypeVal">节点属性值</param>
/// <param name="Text">节点中的内容</param>
/// <returns></returns>
public static XmlElement CreateNode(XmlDocument doc, string NodeName, string[] Nodetype, string[] NodetypeVal, string Text)
{
XmlElement xmlent = doc.CreateElement(NodeName); //创建节点名称
try
{
if (Nodetype != null)
{
for (int i = 0; i < Nodetype.Length; i++)
{
xmlent.SetAttribute(Nodetype[i], NodetypeVal[i]); //添加节点属性和属性值
}
}
if (Text != "" && Text != null)
{
xmlent.InnerText = Text;
}
}
catch (Exception er)
{
throw er;
}
return xmlent;
}
#endregion
#region XM类
//XmlNode xn = xmlDoc.SelectSingleNode("bookstore");
//XmlNodeList xnl = xn.ChildNodes;
//foreach (XmlNode xnf in xnl)
//{
// XmlElement xe = (XmlElement)xnf;
// Console.WriteLine(xe.GetAttribute("genre"));//显示属性值
// Console.WriteLine(xe.GetAttribute("ISBN"));
// XmlNodeList xnf1 = xe.ChildNodes;
// foreach (XmlNode xn2 in xnf1)
// {
// Console.WriteLine(xn2.InnerText);//显示子节点点文本
// }
//}
#endregion
#region XML路径获取 DataSet
/// <summary>
/// 读取xml直接返回DataSet
/// 有几个tr类型就生成几个表 外加table一个表
/// 表面就是
/// ds.Tables["LicenseKey"].Columns.Count// 列号
/// ds.Tables["LicenseKey"].Rows[0][列号].ToString()
/// </summary>
/// <param name="strXmlPath">xml文件相对路径</param>
/// <returns></returns>
public static DataSet GetDataSetByXml(string strXmlPath)
{
try
{
DataSet ds = new DataSet();
ds.ReadXml(FileHelper.GeAbsolutePath(strXmlPath));
if (ds.Tables.Count > 0)
{
return ds;
}
}
catch (Exception ee)
{
throw new Exception(ee.Message);
}
return null;
}
#endregion
#region XML字符串获取 DataSeet
/// <summary>
/// 读取xml字符串直接返回DataSet
/// 有几个tr类型就生成几个表 外加table一个表
/// 表面就是
/// ds.Tables["LicenseKey"].Columns.Count// 列号
/// ds.Tables["LicenseKey"].Rows[0][列号].ToString()
/// </summary>
/// <param name="strXmlData">xml字符串</param>
/// <returns></returns>
public static DataSet GetDataSetStrXml(string strXmlData)
{
try
{
DataSet ds = new DataSet();
using (StringReader xmlread = new StringReader(strXmlData))
{
ds.ReadXml(xmlread, XmlReadMode.InferTypedSchema);
if (ds.Tables.Count > 0)
{
return ds;
}
}
}
catch (Exception ee)
{
throw new Exception(ee.Message);
}
return null;
}
#endregion
#region DataSet XML
/// <summary>
/// DataSet 转换成 XML
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
public static string GetXMLData(DataSet ds)
{
if (ds != null)
{
return ds.GetXml();
}
return "";
}
#endregion
#region XML节点属性修改
/// <summary>
/// XML节点属性修改
/// </summary>
/// <param name="nodelist">
/// 节点集合
/// XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes
/// </param>
/// <param name="typeName">属性名称</param>
/// <param name="typeval">属性值</param>
/// <param name="updatetypeval">修改的属性值</param>
/// <param name="checkchild">是否修改 节点下的子节点</param>
public static void UpdateXmlNodeType(XmlNodeList nodelist, string typeName, string typeval, string updatetypeval, bool checkchild)
{
try
{
foreach (XmlNode xmlnode in nodelist)
{
XmlElement xmlent = (XmlElement)xmlnode;
UpdateXmlNodeType(xmlent, typeName, typeval, updatetypeval);
if (xmlent.HasChildNodes && checkchild) //如果该节点下还有节点 继续搜索
{
UpdateXmlNodeType(xmlent.ChildNodes, typeName, typeval, updatetypeval, checkchild);
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// XML节点属性修改
/// </summary>
/// <param name="xmlent">节点</param>
/// <param name="typeName">属性名称</param>
/// <param name="typeval">属性值</param>
/// <param name="updatetypeval">修改的属性值</param>
public static void UpdateXmlNodeType(XmlElement xmlent, string typeName, string typeval, string updatetypeval)
{
if (xmlent.GetAttribute(typeName) == typeval)
{
xmlent.SetAttribute(typeName, updatetypeval);
}
}
#endregion
#region XML节点的值进行修改
/// <summary>
/// XML节点的值进行修改
/// </summary>
/// <param name="nodelist">
/// 节点集合
/// XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes
/// </param>
/// <param name="TName">节点名</param>
/// <param name="updatetext">修改的值</param>
/// <param name="checkchild">是否修改 节点下的子节点</param>
public static void UpdateXmlNodeText(XmlNodeList nodelist, string TName, string updatetext, bool checkchild)
{
try
{
foreach (XmlNode node in nodelist)
{
XmlElement xmlent = (XmlElement)node;
UpdateXmlNodeText(xmlent, TName, updatetext);
if (xmlent.HasChildNodes && checkchild) //如果该节点下还有节点 继续搜索
{
UpdateXmlNodeText(xmlent.ChildNodes, TName, updatetext, checkchild);
}
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// XML节点的值进行修改
/// </summary>
/// <param name="xmlent">节点</param>
/// <param name="TName">节点名</param>
/// <param name="updatetext">修改的值</param>
public static void UpdateXmlNodeText(XmlElement xmlent, string TName, string updatetext)
{
if (xmlent.Name == TName)
{
xmlent.InnerText = updatetext;
}
}
#endregion
#region XML节点属性删除
/// <summary>
/// XML节点属性删除
/// </summary>
/// <param name="nodelist">
/// 节点集合
/// XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes
/// </param>
/// <param name="typename">属性名</param>
/// <param name="typeval">属性的值</param>
public static void DelXmlNodeType(XmlNodeList nodelist, string typename, string typeval)
{
try
{
foreach (XmlNode node in nodelist)
{
XmlElement xmlent = (XmlElement)node;
DelXmlNodeType(xmlent, typename, typeval);
}
}
catch (Exception ee)
{
throw ee;
}
}
/// <summary>
/// XML节点属性删除
/// </summary>
/// <param name="xmlent">节点</param>
/// <param name="typename">属性名称</param>
/// <param name="typeval">属性值</param>
public static void DelXmlNodeType(XmlElement xmlent, string typename, string typeval)
{
if (xmlent.GetAttribute(typename) == typeval)
{
xmlent.RemoveAttribute(typename);
}
}
#endregion
#region XML节点的全部内容删除和该节点的创建属性
/// <summary>
/// XML节点的全部内容删除 和该节点的创建属性,不删除默认属性
/// </summary>
/// <param name="nodelist">
/// 节点集合
/// XmlNodeList nodeList=xmlDoc.SelectSingleNode("bookstore").ChildNodes
/// </param>
/// <param name="Tname">节点名称</param>
public static void DelXmlNodeAll(XmlNodeList nodelist, string Tname)
{
try
{
foreach (XmlNode node in nodelist)
{
XmlElement xmlent = (XmlElement)node;
DelXmlNodeAll(xmlent, Tname);
}
}
catch (Exception ee)
{
throw ee;
}
}
/// <summary>
/// XML节点的全部内容删除 和该节点的创建属性,不删除默认属性
/// </summary>
/// <param name="xmlent">节点</param>
/// <param name="Tname">节点名</param>
public static void DelXmlNodeAll(XmlElement xmlent, string Tname)
{
if (xmlent.Name == Tname)
{
xmlent.RemoveAll(); //移除内容
}
}
#endregion
#region XML反序列化
/// <summary>
/// XML反序列化
/// </summary>
/// <param name="type">对象类型 (注意类型就是 读取节点的名称)</param>
/// <param name="filename">文件路径</param>
/// <returns></returns>
public static T GetDeserialization<T>(string filename)
{
FileStream fs = null;
try
{
fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(fs);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
}
#endregion
#region XML反序列化成对象
/// <summary>
/// 将XML反序列化成对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="source"></param>
/// <param name="encoding"></param>
/// <returns></returns>
public static T XMLToObject<T>(string source, Encoding encoding)
{
XmlSerializer mySerializer = new XmlSerializer(typeof(T));
using (MemoryStream stream = new MemoryStream(encoding.GetBytes(source)))
{
return (T)mySerializer.Deserialize(stream);
}
}
#endregion
#region XML序列化
/// <summary>
/// XML序列化
/// </summary>
/// <param name="obj">对象</param>
/// <param name="filename">文件路径</param>
public static void SaveDeserialization(object obj, string filename)
{
FileStream fs = null;
try
{
fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
XmlSerializer serializer = new XmlSerializer(obj.GetType());
serializer.Serialize(fs, obj);
}
catch (Exception ex)
{
throw ex;
}
finally
{
if (fs != null)
fs.Close();
}
}
#endregion
//#region 获取Config数据
///// <summary>
///// 获取Config数据
///// </summary>
///// <param name="xmlname">节点名称</param>
///// <returns></returns>
//public static string GetXmlMapPath(string xmlname)
//{
// return ConfigurationManager.AppSettings[xmlname].ToString();
//}
//#endregion
public List<ControlModel> ReadControlByXML(string path, string nodename)
{
XElement xe = XElement.Load(path);
IEnumerable<XElement> elements = from ele in xe.Elements(nodename)
select ele;
return GetControlByElements(elements);
}
public List<ControlModel> GetControlByElements(IEnumerable<XElement> elements)
{
List<ControlModel> list = new List<ControlModel>();
foreach (var ele in elements)
{
ControlModel model = new ControlModel();
model.ControlName = ele.Element("ControlName").Value;
model.ControlBus = ele.Element("ControlBus").Value;
model.ControlIP = ele.Element("ControlIP").Value;
model.ControlID = ele.FirstAttribute.Value;
list.Add(model);
}
return list;
}
public ControlModel ReadControlByXML(string path, string nodename, string controlIP)
{
XElement xe = XElement.Load(path);
IEnumerable<XElement> elements = from ele in xe.Elements(nodename)
select ele;
return GetControlByControlIP(elements, controlIP);
}
public ControlModel GetControlByControlIP(IEnumerable<XElement> elements, string controlIP)
{
ControlModel model = new ControlModel();
foreach (var ele in elements)
{
if (ele.Element("ControlIP").Value == controlIP)
{
model.ControlName = ele.Element("ControlName").Value;
model.ControlBus = ele.Element("ControlBus").Value;
model.ControlIP = ele.Element("ControlIP").Value;
break;
}
}
return model;
}
}
}