ASP.NET XmlDocument类详解
XmlDocument类是.NET框架的DOC解析器。XmlDocument将XML视为树状结构,它装载XML文档,并在内存中构建该文档的树状结构。下面来看下XmlDocument提供了哪些功能。
一、属性:
Attributes 获取一个 XmlAttributeCollection,它包含该节点的属性。 (继承自 XmlNode。)
BaseURI 获取当前节点的基 URI。 (重写 XmlNode..::.BaseURI。)
ChildNodes 获取节点的所有子节点。 (继承自 XmlNode。)
DocumentElement 获取文档的根 XmlElement。
DocumentType 获取包含 DOCTYPE 声明的节点。
FirstChild 获取节点的第一个子级。 (继承自 XmlNode。)
HasChildNodes 获取一个值,该值指示节点是否有任何子节点。 (继承自 XmlNode。)
Implementation 获取当前文档的 XmlImplementation 对象。
InnerText 获取或设置节点及其所有子节点的串联值。 (继承自 XmlNode。)
InnerXml 获取或设置表示当前节点子级的标记。 (重写 XmlNode..::.InnerXml。)
IsReadOnly 获取一个值,该值指示当前节点是否是只读的。 (重写 XmlNode..::.IsReadOnly。)
Item 已重载。
LastChild 获取节点的最后一个子级。 (继承自 XmlNode。)
LocalName 获取节点的本地名称。 (重写 XmlNode..::.LocalName。)
Name 获取节点的限定名。 (重写 XmlNode..::.Name。)
NamespaceURI 获取该节点的命名空间 URI。 (继承自 XmlNode。)
NameTable 获取与此实现关联的 XmlNameTable。
NextSibling 获取紧接在该节点之后的节点。 (继承自 XmlNode。)
NodeType 获取当前节点的类型。 (重写 XmlNode..::.NodeType。)
OuterXml 获取表示此节点及其所有子节点的标记。 (继承自 XmlNode。)
OwnerDocument 获取当前节点所属的 XmlDocument。 (重写 XmlNode..::.OwnerDocument。)
ParentNode 已重载。
Prefix 获取或设置该节点的命名空间前缀。 (继承自 XmlNode。)
PreserveWhitespace 获取或设置一个值,该值指示是否在元素内容中保留空白。
PreviousSibling 获取紧接在该节点之前的节点。 (继承自 XmlNode。)
SchemaInfo 返回节点的后架构验证信息集 (PSVI)。 (重写 XmlNode..::.SchemaInfo。)
Schemas 获取或设置与此 XmlDocument 关联的 XmlSchemaSet 对象。
Value 获取或设置节点的值。 (继承自 XmlNode。)
XmlResolver 设置 XmlResolver 以用于解析外部资源。
二、方法
AppendChild 将指定的节点添加到该节点的子节点列表的末尾。 (继承自 XmlNode。)
Clone 创建此节点的一个副本。 (继承自 XmlNode。)
CloneNode 创建此节点的一个副本。 (重写 XmlNode..::.CloneNode(Boolean)。)
CreateAttribute 已重载。 创建具有指定名称的 XmlAttribute。
CreateCDataSection 创建包含指定数据的 XmlCDataSection。
CreateComment 创建包含指定数据的 XmlComment。
CreateDefaultAttribute 创建具有指定前缀、本地名称和命名空间 URI 的默认属性。
CreateDocumentFragment 创建 XmlDocumentFragment。
CreateDocumentType 返回新的 XmlDocumentType 对象。
CreateElement 已重载。 创建 XmlElement。
CreateEntityReference 创建具有指定名称的 XmlEntityReference。
CreateNavigator 已重载。 创建一个用于导航此文档的新 XPathNavigator 对象。
CreateNode 已重载。 创建 XmlNode。
CreateProcessingInstruction 创建一个具有指定名称和数据的 XmlProcessingInstruction。
CreateSignificantWhitespace 创建一个 XmlSignificantWhitespace 节点。
CreateTextNode 创建具有指定文本的 XmlText。
CreateWhitespace 创建一个 XmlWhitespace 节点。
CreateXmlDeclaration 创建一个具有指定值的 XmlDeclaration 节点。
GetElementById 获取具有指定 ID 的 XmlElement。
GetElementsByTagName 已重载。 返回一个 XmlNodeList,它包含与指定名称匹配的所有子代元素的列表。
GetEnumerator 提供对 XmlNode 中节点上“for each”样式迭代的支持。 (继承自 XmlNode。)
GetHashCode 用作特定类型的哈希函数。 (继承自 Object。)
GetNamespaceOfPrefix 查找当前节点范围内离给定的前缀最近的 xmlns 声明,并返回声明中的命名空间 URI。 (继承自 XmlNode。)
GetPrefixOfNamespace 查找当前节点范围内离给定的命名空间 URI 最近的 xmlns 声明,并返回声明中定义的前缀。 (继承自 XmlNode。)
ImportNode 将节点从另一个文档导入到当前文档。
InsertAfter 将指定的节点紧接着插入指定的引用节点之后。 (继承自 XmlNode。)
InsertBefore 将指定的节点紧接着插入指定的引用节点之前。 (继承自 XmlNode。)
Load 已重载。 从 Stream、URL、TextReader 或 XmlReader 加载指定的 XML 数据。
LoadXml 从指定的字符串加载 XML 文档。
Normalize 将此 XmlNode 下子树完全深度中的所有 XmlText 节点都转换成“正常”形式,在这种形式中只有标记(即标记、注释、处理指令、 CDATA 节和实体引用)分隔 XmlText 节点,也就是说,没有相邻的 XmlText 节点。 (继承自 XmlNode。)
PrependChild 将指定的节点添加到该节点的子节点列表的开头。 (继承自 XmlNode。)
ReadNode 根据 XmlReader 中的信息创建一个 XmlNode 对象。读取器必须定位在节点或属性上。
RemoveAll 移除当前节点的所有子节点和/或属性。 (继承自 XmlNode。)
RemoveChild 移除指定的子节点。 (继承自 XmlNode。)
ReplaceChild 用 newChild 节点替换子节点 oldChild。 (继承自 XmlNode。)
Save 已重载。 将 XML 文档保存到指定的位置。
SelectNodes 已重载。
SelectSingleNode 已重载。
Supports 测试 DOM 实现是否实现特定的功能。 (继承自 XmlNode。)
Validate 已重载。 验证 XmlDocument 是不是 Schemas 属性中包含的 XML 架构定义语言 (XSD) 架构。
WriteContentTo 将 XmlDocument 节点的所有子级保存到指定的 XmlWriter 中。 (重写 XmlNode..::.WriteContentTo(XmlWriter)。)
WriteTo 将 XmlDocument 节点保存到指定的 XmlWriter。 (重写 XmlNode..::.WriteTo(XmlWriter)。)
三、事件
NodeChanged 当属于该文档的节点的 Value 已被更改时发生。
NodeChanging 当属于该文档的节点的 Value 将被更改时发生。
NodeInserted 当属于该文档的节点已被插入另一个节点时发生。
NodeInserting 当属于该文档的节点将被插入另一个节点时发生。
NodeRemoved 当属于该文档的节点已被从其父级移除时发生。
NodeRemoving 当属于该文档的节点将被从文档中移除时发生。
助记属性:
PreviousSibling 上一个兄弟节点
NextSibling 下一个兄弟节点
FirstChild 第一个子节点
LastChild 最后一个子节点
ChildNodes 子节点集合
ParentNode 父节点
代码示例:
xml文档:
<?xml version="1.0" encoding="utf-8" ?>
<Article>
<author age="30">张三</author>
<length>12000</length>
<price>42</price>
</Article>
代码:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml");
//先获取一个唯一的Article节点,再获取其下的第一个子节点 然后再获取该节点下的属性集合
XmlAttributeCollection xc = doc.SelectSingleNode("Article").FirstChild.Attributes;
string age = xc[0].Value; //不过是一个定制的集合罢了,还是集合那套东西 //string age = xc["age"].Value; 支持两种索引访问
Console.WriteLine(age); //输出30
string baseuri = doc.SelectSingleNode("Article").FirstChild.BaseURI;
Console.WriteLine(baseuri); //输出 file:///C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml
XmlNodeList listNode = doc.SelectSingleNode("Article").ChildNodes; //获取Article节点下的所有节点列表
for (int i = 0; i < listNode.Count;i++ ) //XmlNodeList不支持foreach遍历,只能用for
{
Console.Write(listNode[i].Name + " : " + listNode[i].InnerText); //输出 author:张三 length:12000 price:30 Name获取的是限定名,也就是标记名称
}
XmlElement xe = doc.DocumentElement; //获取根节点
Console.WriteLine(xe.Name); //输出 Article
//XmlDocumentType xdt = doc.DocumentType; //获取包含 DOCTYPE 声明的节点。应该是由DTD限定的节点。
//Console.Write(xdt.Name); //此处报 未将对象引用设置到对象的实例,因为找不到有DOCTYPE声明的元素
Console.WriteLine(doc.HasChildNodes); //输出 True 当前Document是否包含子节点。
//XmlImplementation xi = doc.Implementation; //不懂怎么用
//xi.ToString();
Console.WriteLine(doc.InnerText); //获取当前文档的内容 输出 张三 12000 30
Console.WriteLine(doc.InnerXml); //输出 整个Xml文件的字符串内容
Console.WriteLine(doc.IsReadOnly); //获取当前文档是否是只读的。输出 False
XmlNode node = doc.LastChild;
Console.WriteLine(node.InnerText); //输出 张三 12000 30 因为最后一个节点是Article节点,输出Article节点的所有内容
Console.WriteLine(doc.LocalName); //输出 #document
Console.WriteLine(doc.SelectSingleNode("Article").Name); //输出Article
Console.WriteLine(doc.SelectSingleNode("Article").FirstChild.NextSibling.Name); //length author的下一个兄弟节点 是length
XmlNodeType xnt = doc.SelectSingleNode("Article").NodeType;
Console.WriteLine(xnt); //输出Element,表明该节点是元素节点
string str = doc.SelectSingleNode("Article").OuterXml; //此节点及其所有自己点标记,输出Article节点的所有内容 <Article>省略...</Article>
Console.WriteLine(str);
XmlDocument x = new XmlDocument();
x.LoadXml(str);
Console.WriteLine(doc.SelectSingleNode("Article").OwnerDocument); //获取该节点所属的XmlDocument
XmlNode xn = doc.SelectSingleNode("Article").LastChild.ParentNode; //ParentNode获取直接父节点。
Console.WriteLine(xn.Name); //输出 Article
Console.WriteLine(doc.PreserveWhitespace); //是否保留空白 输出False
XmlNode xn1 = doc.SelectSingleNode("Article").LastChild.PreviousSibling;
Console.WriteLine(xn1.Name); //输出length 的确是最后一个节点的前一个节点。
Console.ReadKey();
}
为了更加好的展示一些属性,现在将xml换成这样:
<?xml version="1.0" encoding="utf-8" ?>
<h:Article xmlns:h = "http://www.xxx.com/">
<!--默认命名空间-->
<h:author age="30">张三</h:author>
<h:length>12000</h:length>
<h:price>42</h:price>
</h:Article>
代码如下:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument();
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml");
XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
xnm.AddNamespace("h", "http://www.xxx.com/");
XmlNode Article = doc.SelectSingleNode("h:Article", xnm);
string namespace1 = Article.InnerText;
Console.WriteLine(namespace1); //输出 张三 12000 30
Console.WriteLine(Article.Prefix); //输出 h 获取当前节点的前缀
Console.WriteLine(Article.NamespaceURI); //输出 http://www.xxx.com/123 获取当前节点所在的命名空间
Console.WriteLine(Article.FirstChild.Name + "---" + Article.FirstChild.Value + "---" + Article.FirstChild.LocalName);
//以上一行代码输出 h:author------author
//SchemaInfo 返回节点的后架构验证信息集 (PSVI)。//Value 获取或设置节点的值。 (继承自 XmlNode。)
//XmlResolver 设置 XmlResolver 以用于解析外部资源。
Console.ReadKey();
}
再来一个展示一下Schemas这个常用的属性
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument(); //创建文档
doc.Schemas.Add(null, @"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\person.xsd"); //添加一个架构对象到本XmlDocument
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\person.xml"); //加载xml文件
Console.WriteLine(doc.Schemas.Count); //输出1 就是第二行添加的那个
Console.WriteLine(doc.SchemaInfo.MemberType);
//XmlResolver 设置 XmlResolver 以用于解析外部资源。
Console.ReadKey();
}
下面来试下XmlDocument的方法
Test.xml的代码如下:
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
<book>
<id>1</id>
<title lang="属性1">三国演义</title>
<author>罗贯中</author>
<year>2005</year>
<price id='a1"'>38.5</price>
</book>
<book>
<id>2</id>
<title lang="属性2">西游记</title>
<author>吴承恩</author>
<year>2004</year>
<price>37.5</price>
</book>
</bookstore>
主程序代码如下:
static void Main(string[] args)
{
XmlDocument doc = new XmlDocument(); //创建文档
doc.Load(@"C:\Users\Administrator\Desktop\ConsoleApplication1\ConsoleApplication1\Test.xml"); //加载xml文件
XmlNode node1 = doc.CreateNode(XmlNodeType.Element, "pagecount", null);
node1.InnerText = "222";
doc.SelectSingleNode("/bookstore").AppendChild(node1); //执行之后 <pagecount>222</pagecount>元素被添加到</bookstore>前面
doc.Save(@"D:\123.xml");
XmlNode node2 = doc.SelectSingleNode("/bookstore/book[1]/title[1]").Clone(); //克隆一个节点出来
Console.WriteLine(node2.InnerText); //输出三国演义
XmlNode node3 = doc.SelectSingleNode("/bookstore/book[1]/title[1]").CloneNode(true); //参数决定是否克隆子节点数(如果false,文本节点也不克隆)
Console.WriteLine(node3.InnerText); //输出三国演义
XmlAttribute attr = doc.CreateAttribute("age"); //创建一个age属性
attr.Value = "23";
doc.SelectSingleNode("/bookstore/book[1]/author[1]").Attributes.Append(attr); //执行之后第一个作者变为 <author age="23">罗贯中</author>
doc.Save(@"D:\123.xml");
XmlCDataSection cdata = doc.CreateCDataSection("我&你");
doc.SelectSingleNode("/bookstore/book[1]/author[1]").AppendChild(cdata); //执行之后author变为<author age="23">罗贯中<![CDATA[我&你]]></author>
doc.Save(@"D:\123.xml");
XmlComment com = doc.CreateComment("2013-2-27 22:37:25");
doc.SelectSingleNode("/bookstore/book[1]/title[1]").AppendChild(com); //执行之后title变为<title lang="属性1">三国演义<!--2013-2-27 22:37:25--></title>
doc.Save(@"D:\123.xml");
XmlDocument doc1 = new XmlDocument();
XmlDocumentFragment xdf = doc1.CreateDocumentFragment(); //一个xml片段,这个类敢情好用
xdf.InnerXml = "<item>widget</item>";
doc1.AppendChild(xdf);
Console.WriteLine(doc1.OuterXml); //输出<item>widget</item>
//CreateDefaultAttribute 创建具有指定前缀、本地名称和命名空间 URI 的默认属性。
//CreateDocumentType 返回新的 XmlDocumentType 对象。
XmlDocument doc2 = new XmlDocument();
XmlElement element = doc2.CreateElement("title"); //创建一个title 如果现在保存是输出<title/> 因为还没有内容
doc2.AppendChild(element);
XmlEntityReference xer = doc2.CreateEntityReference("h");
doc2.LastChild.AppendChild(xer);
Console.WriteLine(doc2.OuterXml); //输出</title>&h;</title>
XPathNavigator nav = doc2.CreateNavigator(); //一个通过光标的导航模型遍历XML文档的数据
XmlText text = doc2.CreateTextNode("你好啊"); //创建一个文本节点
doc2.SelectSingleNode("/title").AppendChild(text);
Console.WriteLine(doc2.OuterXml); //输出</title>&h;你好啊</title>
XmlWhitespace xws = doc2.CreateWhitespace(" "); //创建一个空白节点
doc2.SelectSingleNode("/title").AppendChild(xws);
Console.WriteLine(doc2.OuterXml); //输出</title>&h;你好啊 </title>
XmlDeclaration xd = doc2.CreateXmlDeclaration("1.0", "utf-8", "yes"); //xml头 XML声明部分
XmlNode root = doc2.SelectSingleNode("/title");
doc2.InsertBefore(xd, root);
Console.WriteLine(doc2.OuterXml); //执行之后 在头部加入了<?xml version="1.0" encoding="utf-8" standalont="yes"?>
XmlSignificantWhitespace xsw = doc2.CreateSignificantWhitespace(" ");
XmlElement ele = doc2.CreateElement("white");
ele.InnerText = "空白啊空白";
ele.AppendChild(xsw);
doc2.SelectSingleNode("/title").AppendChild(ele);
Console.WriteLine(doc2.OuterXml); //还是添加一大堆空白,不知道与CreateWhitespace有什么区别
XmlDocument doc3 = new XmlDocument();
String PItext = "type='text/xsl' href='book.xsl'";
XmlProcessingInstruction newPI = doc3.CreateProcessingInstruction("xml-stylesheet", PItext);
doc3.AppendChild(newPI);
Console.WriteLine(doc3.OuterXml); //输出 <?xml-stylesheet type="text/xsl" hred="book.xsl"?>
//GetElementById 获取具有指定 ID 的 XmlElement。
//GetElementsByTagName 已重载。 返回一个 XmlNodeList,它包含与指定名称匹配的所有子代元素的列表。
//GetEnumerator 提供对 XmlNode 中节点上“for each”样式迭代的支持。 (继承自 XmlNode。)
//GetNamespaceOfPrefix 查找当前节点范围内离给定的前缀最近的 xmlns 声明,并返回声明中的命名空间 URI。 (继承自 XmlNode。)
//GetPrefixOfNamespace 查找当前节点范围内离给定的命名空间 URI 最近的 xmlns 声明,并返回声明中定义的前缀。 (继承自 XmlNode。)
//ImportNode 将节点从另一个文档导入到当前文档。
//InsertAfter 将指定的节点紧接着插入指定的引用节点之后。 (继承自 XmlNode。)
//InsertBefore 将指定的节点紧接着插入指定的引用节点之前。 (继承自 XmlNode。)
//LoadXml 从指定的字符串加载 XML 文档。
//Normalize 将此 XmlNode 下子树完全深度中的所有 XmlText 节点都转换成“正常”形式,在这种形式中只有标记(即标记、注释、处理指令、 CDATA 节和实体引用)分隔 XmlText 节点,也就是说,没有相邻的 XmlText 节点。 (继承自 XmlNode。)
//PrependChild 将指定的节点添加到该节点的子节点列表的开头。 (继承自 XmlNode。)
//ReadNode 根据 XmlReader 中的信息创建一个 XmlNode 对象。读取器必须定位在节点或属性上。
//RemoveAll 移除当前节点的所有子节点和/或属性。 (继承自 XmlNode。)
//RemoveChild 移除指定的子节点。 (继承自 XmlNode。)
//ReplaceChild 用 newChild 节点替换子节点 oldChild。 (继承自 XmlNode。)
//Supports 测试 DOM 实现是否实现特定的功能。 (继承自 XmlNode。)
//Validate 已重载。 验证 XmlDocument 是不是 Schemas 属性中包含的 XML 架构定义语言 (XSD) 架构。
//WriteContentTo 将 XmlDocument 节点的所有子级保存到指定的 XmlWriter 中。 (重写 XmlNode..::.WriteContentTo(XmlWriter)。)
//WriteTo 将 XmlDocument 节点保存到指定的 XmlWriter。 (重写 XmlNode..::.WriteTo(XmlWriter)。)
Console.ReadKey();
}
相关文章
- 这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
ASP.NET Core根据环境变量支持多个 appsettings.json配置文件
这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
详解ASP.NET Core 中基于工厂的中间件激活的实现方法
这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22asp.net通过消息队列处理高并发请求(以抢小米手机为例)
这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22ASP.NET单选按钮控件RadioButton常用属性和方法介绍
RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表
在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19ASP.NET中iframe框架点击左边页面链接 右边显示链接页面内容
这篇文章主要介绍了ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容的实现代码,感兴趣的小伙伴们可以参考一下...2021-09-22- ASP.NET Web API具有与ASP.NET MVC类似的编程方式,ASP.NET Web API不仅仅具有一个完全独立的消息处理管道,而且这个管道比为ASP.NET MVC设计的管道更为复杂,功能也更为强大。下面创建一个简单的Web API项目,需要的朋友可以参考下...2021-09-22
- 这篇文章主要介绍了ASP.NET连接MySql数据库的2个方法及示例,使用的是MySQL官方组件和ODBC.NET,需要的朋友可以参考下...2021-09-22
- 这篇文章主要介绍了Asp.Net使用Bulk实现批量插入数据的方法,对于进行asp.net数据库程序设计非常有借鉴价值,需要的朋友可以参考下...2021-09-22
在ASP.NET 2.0中操作数据之二十九:用DataList和Repeater来显示数据
本文主要讲解ASP.NET 2.0中如何使用DataList 和 Repeater 来呈现数据,DataList包含一个table标记,而Repeater不会添加任何额外的代码,个人在实际开发中更推荐使用Repeater。...2021-09-22- 这篇文章主要介绍了获取DataTable选择第一行某一列值,需要的朋友可以参考下...2021-09-22
- 这篇文章主要介绍了ASP.Net中的async+await异步编程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
- 这篇文章介绍了Asp.net动态生成html页面的方法,有需要的朋友可以参考一下...2021-09-22
- 这篇文章主要介绍了详解ASP.NET Core Token认证,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2021-09-22
- .net core是最近讨论频率很高的话题,下面这篇文章主要给大家介绍了关于利用.NET Core如何获取操作系统中各种信息的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧...2021-09-22
ASP.NET百度Ueditor编辑器实现上传图片添加水印效果
这篇文章主要给大家介绍了ASP.NET百度Ueditor编辑器1.4.3这个版本实现上传图片添加水印效果的相关资料,文中通过图文及示例代码介绍的非常详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。...2021-09-22- 这篇文章主要介绍了asp.net core MVC之实现基于token的认证,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-07