C# 通过反射 XML 互转 Model 类
实操
<Info xmlns="">
<Error>User 錯誤</Error>
</Info>
public class ResponseModel
{
public class InfoModel
{
public string Error { get; set; }
}
public InfoModel Info { get; set; }
}
调用
ResponseModel reqXMLData = XmlToModel<ResponseModel>(xml);
方法
/// <summary>
/// XML 转Model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Model"></param>
/// <param name="xmlContent"></param>
/// <param name="xmlRootName"></param>
/// <returns></returns>
public static T XmlToModel<T>(string xmlContent)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xmlContent);
object obj = Activator.CreateInstance(typeof(T));
RecurveType(obj, xmlDoc, null);
return (T)obj;
} /// <summary>
/// 递归XML给模型赋值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="xmlDoc"></param>
/// <param name="xn"></param>
public static void RecurveType<T>(T model, XmlDocument xmlDoc, XmlNode xn)
{
var type = model.GetType();
foreach (System.Reflection.PropertyInfo pro in type.GetProperties())
{
if ((pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed) && xn != null)
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
XmlNode xnValue= xe.SelectSingleNode(pro.Name);
if (null != xnValue)
{
pro.SetValue(model, xnValue.InnerText, null);
}
}
else
{
pro.SetValue(model, val, null);
} }
else
{
if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
{
if (xn == null)
{
var dddddd = pro.PropertyType.BaseType.Name;
var ddddd = xmlDoc.SelectSingleNode(pro.Name);
}
else
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
pro.SetValue(model, xe.InnerText, null);
}
else
{
pro.SetValue(model, val, null);
}
} }
else
{
XmlNode xlNode = null;
if (xn == null)
{
xlNode = xmlDoc.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xn.ChildNodes, pro.Name); }
}
else
{
xlNode = xn.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xn.ChildNodes, pro.Name); }
}
xn = xlNode; //判断该对象是否为list
var IsGenericType = pro.PropertyType.IsGenericType;
var list = pro.PropertyType.GetInterface("IEnumerable", false);
if (IsGenericType && list != null)
{
Type proType = pro.PropertyType;
var modelList = Activator.CreateInstance(proType) as IEnumerable<object>;
var listPro = modelList.GetType().GetProperty("Item");
var ml = listPro.PropertyType; object objA = Activator.CreateInstance(ml);
RecurveType(objA, xmlDoc, xn);
var addMethod = modelList.GetType().GetMethod("Add");
addMethod.Invoke(modelList, new object[] { objA });
pro.SetValue(model, modelList, null);
}
else
{
object objA = Activator.CreateInstance(pro.PropertyType);
RecurveType(objA, xmlDoc, xn);
pro.SetValue(model, objA, null);
}
} }
}
} /// <summary>
/// 获取XML 节点
/// </summary>
/// <param name="xnList"></param>
/// <param name="stridr"></param>
/// <returns></returns>
public static XmlNode GetXmlNode(XmlNodeList xnList, string stridr)
{
XmlNode xn = null;
foreach (XmlNode item in xnList)
{
xn = item.SelectSingleNode(stridr);
if (xn == null)
{
GetXmlNode(item.ChildNodes, stridr);
if (item.Name == stridr)
{
xn = item;
}
}
}
return xn;
}
零碎的代码总结
public class XMLHelper
{
/// <summary>
/// 模型转XML文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="suf"></param>
/// <param name="strIde"></param>
/// <returns></returns>
public static string ModelRecurveToXML<T>(T model, StringBuilder suf, string strIde = "")
{
StringBuilder builder = new StringBuilder();
System.Reflection.PropertyInfo[] proArray = model.GetType().GetProperties();
foreach (System.Reflection.PropertyInfo pro in proArray)
{
if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
{
if (string.IsNullOrWhiteSpace(strIde))
{
builder.Append(string.Format("<{0}>{1}</{2}>", pro.Name, pro.GetValue(model, null), pro.Name));
}
else
{
string value = SetXmlValue(pro.Name, pro.GetValue(model, null));
builder.Append(value);
}
}
else
{
if (!string.IsNullOrWhiteSpace(strIde))
{
string str = "<" + strIde + builder.ToString() + ">";
builder = new StringBuilder();
builder.Append(str);
strIde = string.Empty;
}
var IsGenericType = pro.PropertyType.IsGenericType;
var list = pro.PropertyType.GetInterface("IEnumerable", false);
if (IsGenericType && list != null)
{
var listVal = pro.GetValue(model, null) as IEnumerable<object>;
if (listVal == null) continue;
foreach (var aa in listVal)
{
var dtype = aa.GetType();
builder.Append(ModelRecurveToXML(aa, suf, pro.Name) + " </" + pro.Name + ">");
}
}
else
{
suf.Insert(0, "</" + pro.Name + ">");
var val = pro.GetValue(model, null);
builder.Append(ModelRecurveToXML(val, suf, pro.Name));
}
}
}
if (!string.IsNullOrWhiteSpace(strIde))
{
builder.Insert(0, "<" + strIde + "");
builder.Append(">");
}
return builder.ToString();
}
/// <summary>
/// 设置XML 值
/// </summary>
/// <param name="value"></param>
/// <param name="name"></param>
/// <returns></returns>
public static string SetXmlValue(string name, object value)
{
string str = string.Empty;
if (value != null)
{
bool inse = false;
if (value.GetType() == typeof(DateTime))
{
if (default(DateTime) != (DateTime)value)
{
inse = true;
}
}
else if (value.GetType() == typeof(string))
{
inse = true;
}
else if (value.GetType() == typeof(int))
{
if (default(int) != (int)value)
{
inse = true;
}
}
else if (value.GetType() == typeof(decimal))
{
if (default(decimal) != (decimal)value)
{
inse = true;
}
}
else if (value.GetType() == typeof(double))
{
if (default(double) != (double)value)
{
inse = true;
}
}
if (inse)
{
str = string.Format(" {0}='{1}'", name, value);
}
}
return str;
}
/// <summary>
/// XML 转Model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Model"></param>
/// <param name="xmlContent"></param>
/// <param name="xmlRootName"></param>
/// <returns></returns>
public static T XmlToModel<T>(T Model, string xmlContent, string xmlRootName)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xmlContent);
object obj = Activator.CreateInstance(Model.GetType());
RecurveType(obj, xmlDoc, null);
return (T)obj;
}
/// <summary>
/// 获取XML 节点
/// </summary>
/// <param name="xnList"></param>
/// <param name="stridr"></param>
/// <returns></returns>
public static XmlNode GetXmlNode(XmlNodeList xnList, string stridr)
{
XmlNode xn = null;
foreach (XmlNode item in xnList)
{
xn = item.SelectSingleNode(stridr);
if (xn == null)
{
GetXmlNode(item.ChildNodes, stridr);
if (item.Name == stridr)
{
xn = item;
}
}
}
return xn;
}
/// <summary>
/// 递归XML给模型赋值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="xmlDoc"></param>
/// <param name="xn"></param>
public static void RecurveType<T>(T model, XmlDocument xmlDoc, XmlNode xn)
{
var type = model.GetType();
foreach (System.Reflection.PropertyInfo pro in type.GetProperties())
{
if ((pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed) && xn != null)
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
pro.SetValue(model, xe.InnerText, null);
}
else
{
pro.SetValue(model, val, null);
}
}
else
{
if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
{
if (xn == null)
{
var dddddd = pro.PropertyType.BaseType.Name;
var ddddd = xmlDoc.SelectSingleNode(pro.Name);
}
else
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
pro.SetValue(model, xe.InnerText, null);
}
else
{
pro.SetValue(model, val, null);
}
}
}
else
{
XmlNode xlNode = null;
if (xn == null)
{
xlNode = xmlDoc.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xn.ChildNodes, pro.Name);
}
}
else
{
xlNode = xn.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xn.ChildNodes, pro.Name);
}
}
xn = xlNode;
//判断该对象是否为list
var IsGenericType = pro.PropertyType.IsGenericType;
var list = pro.PropertyType.GetInterface("IEnumerable", false);
if (IsGenericType && list != null)
{
Type proType = pro.PropertyType;
var modelList = Activator.CreateInstance(proType) as IEnumerable<object>;
var listPro = modelList.GetType().GetProperty("Item");
var ml = listPro.PropertyType;
object objA = Activator.CreateInstance(ml);
RecurveType(objA, xmlDoc, xn);
var addMethod = modelList.GetType().GetMethod("Add");
addMethod.Invoke(modelList, new object[] { objA });
pro.SetValue(model, modelList, null);
}
else
{
object objA = Activator.CreateInstance(pro.PropertyType);
RecurveType(objA, xmlDoc, xn);
pro.SetValue(model, objA, null);
}
}
}
}
}
}
第二次整理 model 互转 XML
public class XmlHelper
{ public static XmlElement LuoCreateXmlElement(XmlDocument thisValue, string content, string str)
{
XmlElement x1 = thisValue.CreateElement(str);
x1.InnerText = DataConversionType.ConvertString(string.IsNullOrWhiteSpace(content.Trim()) ? "" : content.Trim(), DataConversionType.StringTypeEnum.繁);
return x1;
}
/// <summary>
/// 读取文件,返回相应字符串
/// </summary>
/// <param name="fileName">文件路径</param>
/// <returns>返回文件内容</returns>
public static string ReadFile(string fileName)
{
StringBuilder str = new StringBuilder();
using (FileStream fs = File.OpenRead(fileName))
{
StreamReader streamReader = new StreamReader(fs, Encoding.GetEncoding("Big5"));
string line = "";
while ((line = streamReader.ReadLine()) != null)
{
string encGi5 = Encoding.GetEncoding("Big5").GetString(System.Text.Encoding.GetEncoding("Big5").GetBytes(line.Trim()));
if (!string.IsNullOrWhiteSpace(encGi5))
{
str = str.Append(encGi5);
} } }
return str.ToString();
} /// <summary>
/// XML 转Model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Model"></param>
/// <param name="xmlContent"></param>
/// <param name="xmlRootName"></param>
/// <returns></returns>
public static T XmlToModel<T>(string xmlContent)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xmlContent);
object obj = Activator.CreateInstance(typeof(T));
RecurveType(obj, xmlDoc, null);
return (T)obj;
}
/// <summary>
/// 设置XML 值
/// </summary>
/// <param name="value"></param>
/// <param name="name"></param>
/// <returns></returns>
public static object SetXmlValue(Type objType, object value)
{ if (value != null)
{ if (objType == typeof(DateTime))
{
return Convert.ToDateTime(value);
}
else if (objType == typeof(string))
{
return Convert.ToString(value);
}
else if (objType == typeof(int))
{
return Convert.ToInt32(value);
}
else if (objType == typeof(Int64))
{
return Convert.ToInt64(value);
}
else if (objType == typeof(decimal))
{
return Convert.ToDecimal(value);
}
else if (objType == typeof(double))
{
return Convert.ToDouble(value);
}
else if (objType == typeof(bool))
{
return Convert.ToBoolean(value);
} }
return value;
}
/// <summary>
/// 递归XML给模型赋值
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="xmlDoc"></param>
/// <param name="xn"></param>
public static void RecurveType<T>(T model, XmlDocument xmlDoc, XmlNode xn)
{
var type = model.GetType();
foreach (System.Reflection.PropertyInfo pro in type.GetProperties())
{
if ((pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed) && xn != null)
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
XmlNode xnValue = xe.SelectSingleNode(pro.Name);
if (null != xnValue)
{
pro.SetValue(model, SetXmlValue(pro.PropertyType, xnValue.InnerText), null);
}
}
else
{
pro.SetValue(model, val, null);
} }
else
{
if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
{
if (xn == null)
{ XmlNode xlNode = xmlDoc.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xmlDoc.ChildNodes, pro.Name); }
}
else
{
XmlElement xe = (XmlElement)xn;
var val = xe.GetAttribute(pro.Name);
if (string.IsNullOrWhiteSpace(val))
{
pro.SetValue(model, xe.InnerText, null);
}
else
{
pro.SetValue(model, val, null);
}
} }
else
{
XmlNode xlNode = null;
if (xn == null)
{
xlNode = xmlDoc.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xn.ChildNodes, pro.Name); }
}
else
{
xlNode = xn.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = xmlDoc.SelectSingleNode(pro.Name);
if (xlNode == null)
{
xlNode = GetXmlNode(xmlDoc.ChildNodes, pro.Name);
}
}
}
xn = xlNode; //判断该对象是否为list
var IsGenericType = pro.PropertyType.IsGenericType;
var list = pro.PropertyType.GetInterface("IEnumerable", false);
if (IsGenericType && list != null)
{
Type proType = pro.PropertyType;
var modelList = Activator.CreateInstance(proType) as IEnumerable<object>;
var listPro = modelList.GetType().GetProperty("Item");
var ml = listPro.PropertyType; object objA = Activator.CreateInstance(ml);
RecurveType(objA, xmlDoc, xn);
var addMethod = modelList.GetType().GetMethod("Add");
addMethod.Invoke(modelList, new object[] { objA });
pro.SetValue(model, modelList, null);
}
else
{
object objA = Activator.CreateInstance(pro.PropertyType);
RecurveType(objA, xmlDoc, xn);
pro.SetValue(model, objA, null);
}
} }
}
} /// <summary>
/// 获取XML 节点
/// </summary>
/// <param name="xnList"></param>
/// <param name="stridr"></param>
/// <returns></returns>
public static XmlNode GetXmlNode(XmlNodeList xnList, string stridr)
{
XmlNode xn = null;
foreach (XmlNode item in xnList)
{
xn = item.SelectSingleNode(stridr);
if (xn == null)
{
xn = GetXmlNode(item.ChildNodes, stridr);
}
if (xn != null)
{
break;
} }
return xn;
} public static StringBuilder ModelRecurveToXML<T>(T model, StringBuilder builder)
{
StringBuilder builder3 = new StringBuilder(); foreach (System.Reflection.PropertyInfo pro in model.GetType().GetProperties())
{
if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
{
builder.Append(string.Format("<{0}>{1}<{2}>", pro.Name, pro.GetValue(model, null), pro.Name)); }
else
{
var IsGenericType = pro.PropertyType.IsGenericType;
var list = pro.PropertyType.GetInterface("IEnumerable", false);
if (IsGenericType && list != null)
{
builder.Append(string.Format("<{0}", pro.Name));
var listVal = pro.GetValue(model, null) as IEnumerable<object>;
if (listVal == null) continue;
StringBuilder listBuilder = new StringBuilder(); foreach (var aa in listVal)
{
var dtype = aa.GetType();
foreach (var bb in dtype.GetProperties())
{
listBuilder.Append(string.Format(" {0}={1}", bb.Name, bb.GetValue(aa, null)));
}
}
builder.Append(string.Format("{0}></{1}>", listBuilder, pro.Name));
}
else
{
builder3.Insert(0, string.Format("</{0}>", pro.Name));
builder.Append(string.Format("<{0}", pro.Name));
StringBuilder builder2 = new StringBuilder();
foreach (var item in pro.GetValue(model, null).GetType().GetProperties())
{ if (item.PropertyType.IsPrimitive || item.PropertyType.IsSealed)
{
builder2.Append(string.Format(" {0}={1}", item.Name, item.GetValue(pro.GetValue(model, null), null)));
}
else
{
builder.Append(string.Format(">"));
builder3.Insert(0, string.Format("</{0}>", item.Name));
builder.Append(string.Format("<{0}", item.Name));
var data2 = item.GetValue(pro.GetValue(model, null), null);
foreach (var item2 in data2.GetType().GetProperties())
{
if (item2.PropertyType.IsPrimitive || item2.PropertyType.IsSealed)
{
builder2.Append(string.Format(" {0}={1}", item2.Name, item2.GetValue(data2, null)));
}
else
{
builder3.Insert(0, string.Format("</{0}>", item2.Name));
} }
}
}
builder.Append(string.Format("{0}>", builder2.ToString()));
} }
}
builder.Append(builder3);
return builder;
} /// <summary>
/// XML 转Model
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="Model"></param>
/// <param name="xmlContent"></param>
/// <param name="xmlRootName"></param>
/// <returns></returns>
public static T XmlToModel<T>(T Model, string xmlContent, string xmlRootName)
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.XmlResolver = null;
xmlDoc.LoadXml(xmlContent); object obj = Activator.CreateInstance(Model.GetType());
RecurveType(obj, xmlDoc, null);
return (T)obj;
} /// <summary>
/// 模型转XML文件
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="model"></param>
/// <param name="suf"></param>
/// <param name="strIde"></param>
/// <returns></returns>
public static string ModelToXML<T>(T model) where T : class, new()
{
StringBuilder builder = new StringBuilder(); System.Reflection.PropertyInfo[] proArray = model.GetType().GetProperties(); foreach (System.Reflection.PropertyInfo pro in proArray)
{
if (pro.PropertyType.IsPrimitive || pro.PropertyType.IsSealed)
{
builder.Append(string.Format("<{0}>{1}</{2}>", pro.Name, pro.GetValue(model, null), pro.Name));
}
else
{
var IsGenericType = pro.PropertyType.IsGenericType;
var list = pro.PropertyType.GetInterface("IEnumerable", false);
if (IsGenericType && list != null)
{
var listVal = pro.GetValue(model, null) as IEnumerable<object>;
if (listVal == null) continue; foreach (var item in listVal)
{
var objValue = item;
if (objValue == null)
{
objValue = System.Activator.CreateInstance(objValue.GetType());
}
string str = string.Format("<{0}>{1}</{2}>", pro.Name, ModelToXML(objValue), pro.Name);
builder.Append(str);
}
}
else
{ var objValue = pro.GetValue(model, null);
if (objValue == null)
{
objValue = System.Activator.CreateInstance(pro.PropertyType);
}
string str = string.Format("<{0}>{1}</{2}>", pro.Name, ModelToXML(objValue), pro.Name);
builder.Append(str);
} }
} return builder.ToString();
} }
C# 通过反射 XML 互转 Model 类的更多相关文章
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
ASP.NET MVC 学习笔记-2.Razor语法 1. 表达式 表达式必须跟在“@”符号之后, 2. 代码块 代码块必须位于“@{}”中,并且每行代码必须以“: ...
- 为测试框架model类自动生成xml结果集
问题:有大量类似于theProductId这样名字的字符串需要转换成the_product_id这种数据库column名的形式. 思路:见到(见)大写字母(缝)就插入(插)一个“_”字符(针)进去,最 ...
- .NET技术-1.0.使用反射、特性简化代码(验证Model类)
使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...
- JAXB java类与xml互转
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...
- 利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理
利用反射和泛型把Model对象按行储存进数据库以及按行取出然后转换成Model 类实例 MVC网站通用配置项管理 2018-3-10 15:18 | 发布:Admin | 分类:代码库 | 评论: ...
- List实体类、DataTable与xml互转
序列化常用Attribute讲解说明 [XmlRootAttribute("MyCity", Namespace="abc.abc", IsNullable=f ...
- xml和map互转工具类
/** * xml转map工具类 * @author zhangyao * */ public class XmlToMapUtil { /** * xml转map 不带属性 * @param xml ...
- Java反射xml数据类
我们做自己的自动化测试.遇到使用xml存储数据,然而,这些数据可以被封装成一个类.将数据传递.通过下面的实际例子,展示给大家.请欣赏. 第一步:xml数据存储将被使用 第二步:读取xml文件的方法 第 ...
- JAVA bean与XML互转的利器---XStream
最近在项目中遇到了JAVA bean 和XML互转的需求, 本来准备循规蹈矩使用dom4j忽然想起来之前曾接触过的XStream, 一番研究豁然开朗,利器啊利器, 下来就XStream的一些用法与大家 ...
- 反射实现 Data To Model
调用 : public ActionResult Index() { DataTable dt = new DataTable(); dt.Columns.Add("Name"); ...
随机推荐
- IIS7配置301永久重定向
我把我的小域名www.taadis.com301永久重定向到taadis.com. 关键图解:
- 学习EXTJS6(9)面向对象的基础框架-1
Ext创造一套精细的对象模型与API,用这套API,可以快速实现对象的定义.创建.继承和扩展:1. 1.创建新类 Ext.define('demo.Demo',{ name: 'usegear', h ...
- 掌握Tortoise-ORM高级异步查询技巧
title: 掌握Tortoise-ORM高级异步查询技巧 date: 2025/04/22 12:05:33 updated: 2025/04/22 12:05:33 author: cmdrago ...
- 通过apache tika从文档(pdf、doc、docx、txt)中 提取特征数据
本文介绍如何通过apache tika从文档(pdf.doc.docx.txt)中 提取特征数据,比如文档中有身份证.姓名等信息.[全部是经本人实际测试过的功能] 1.需引入相关pom依赖 <! ...
- AI Agent核心技术揭秘:从理论到实践(中篇)
认知是成本最低的对冲. --张三思维进化论 回顾与展望:从认知到技术的桥梁 在上一篇文章中,我们探讨了AI Agent的概念.特征和与传统AI的本质区别.我们认识到,AI Agent不仅是对话工具,更 ...
- 使用Electron构建跨平台的抓取桌面程序
谈起桌面应用开发技术, 我们会想到.Net下的WinForm, Java下的JavaFX以及Linux下的QT. 这些技术对于Web应用程序员来说一般比较陌生, 因为大多Web应用程序员的开发技能是前 ...
- 阿里云部署Django主要注意事项
(1)virtualenv 报错 os 没有 PathLike属性 阿里云ubuntu16.0服务器默认python版本分别是2.7.12,3.5.2,而PathLike是在python 3.6时才被 ...
- to查完成绩的夏夏
虽然不知道你现在看到的成绩是310还是340,抑或预估值域外的其他成绩,此刻我都想对你说你真的很棒! 还记得吗,一个人拖着个行李箱,来到陌生的城市二战,只有要去更大的世界的决心和傻气.有的时候会怀疑自 ...
- 探秘Transformer系列之(34)--- 量化基础
探秘Transformer系列之(34)--- 量化基础 目录 探秘Transformer系列之(34)--- 量化基础 0x00 概述 0x01 背景知识 1.1 需求 1.2 压缩 1.3 如何表 ...
- Ubuntu 通过 docker 部署禅道
# 拉取镜像 docker pull easysoft/zentao:latest # 运行容器(简单配置) docker run --name zentao -p 8080:80 -e MYSQL_ ...