678 lines
22 KiB
C#
678 lines
22 KiB
C#
|
|
using System;
|
|||
|
|
using System.Xml;
|
|||
|
|
using CYQ.Data.Cache;
|
|||
|
|
using System.IO;
|
|||
|
|
using System.Threading;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Text;
|
|||
|
|
using CYQ.Data.Tool;
|
|||
|
|
using System.Windows.Forms;
|
|||
|
|
/*
|
|||
|
|
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* 1<EFBFBD><EFBFBD>DTD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>&xxx;<EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DTD·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ء<EFBFBD>
|
|||
|
|
* 2<EFBFBD><EFBFBD>XmlDocument<EFBFBD><EFBFBD>LoadXml <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ棬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫת<EFBFBD><EFBFBD>Ҳû<EFBFBD><EFBFBD>ô<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣺
|
|||
|
|
* ---------------------------------------------------------------------------------------
|
|||
|
|
* A<EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD>Doc<EFBFBD>ó<EFBFBD>InnerXml<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LoadXml(xml)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ż<EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* B<EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD>Doc<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>Clone<EFBFBD><EFBFBD>CloneNode(true)<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲ<EFBFBD>࣬<EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>š<EFBFBD>
|
|||
|
|
* C<EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD>Doc<EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>XmlDocument ImportNode <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CloneNode(true) <EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* D<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><EFBFBD>C<EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣺.NET <EFBFBD>±<EFBFBD>ǩ<EFBFBD>Ապϡ<EFBFBD>.NET Core<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GetCloneFrom <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* E<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǩ<EFBFBD>Ապ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣺<EFBFBD>̳<EFBFBD>XmlDocument<EFBFBD><EFBFBD><EFBFBD><EFBFBD>дCreateElement<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>W3C<EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>Ապϵģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XmlElement<EFBFBD><EFBFBD>IsEmpty=false<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XhtmlDocument
|
|||
|
|
* F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܣ<EFBFBD><EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DTD<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD>⣺
|
|||
|
|
* G<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>F<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>DTDͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD><!DOCTYPE html>ͷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XHtmlAction OutXml<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* ----------------------------------------------------------------------------------------
|
|||
|
|
* 4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD> InnerXml <EFBFBD><EFBFBD><EFBFBD>ԣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>InnerText<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>õȣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD><EFBFBD>ֵtext<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ㡣
|
|||
|
|
*/
|
|||
|
|
namespace CYQ.Data.Xml
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>Xml<6D><6C>XHtml<6D>Ļ<EFBFBD><C4BB><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public abstract class XHtmlBase : IDisposable
|
|||
|
|
{
|
|||
|
|
private Encoding _Encoding = Encoding.UTF8;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public Encoding Encoding
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _Encoding;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_Encoding = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>LoadData(MDataRow,pre)<29><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>)
|
|||
|
|
/// </summary>
|
|||
|
|
protected List<string> PreList;
|
|||
|
|
/// <summary>
|
|||
|
|
/// xml<6D><6C><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
protected XmlDocument _XmlDocument;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ڲ<EFBFBD>XmlDocument<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ReadOnly<6C><79>
|
|||
|
|
/// </summary>
|
|||
|
|
public XmlDocument XmlDoc
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _XmlDocument;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
protected XmlNamespaceManager xnm;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
protected DistributedCache theCache;
|
|||
|
|
/// <summary>
|
|||
|
|
/// Html<6D><6C><EFBFBD>ƿռ<C6BF>
|
|||
|
|
/// </summary>
|
|||
|
|
protected string htmlNameSpace = "http://www.w3.org/1999/xhtml";
|
|||
|
|
internal string PreXml = "preXml";
|
|||
|
|
|
|||
|
|
private string _FileName = string.Empty;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ص<EFBFBD>Xml<6D>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>ReadOnly<6C><79>
|
|||
|
|
/// </summary>
|
|||
|
|
public string FileName
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _FileName;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// xml<6D><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>key
|
|||
|
|
/// </summary>
|
|||
|
|
private string xmlCacheKey = string.Empty;
|
|||
|
|
private bool _IsReadOnly;
|
|||
|
|
/// <summary>
|
|||
|
|
/// XHtml <20><><EFBFBD>ص<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>Ƿ<EFBFBD>ֻ<EFBFBD><D6BB>ģʽ
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsReadOnly
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _IsReadOnly;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_IsReadOnly = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
private bool _IsLoadFromCache;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ĵ<EFBFBD><C4B5>Ƿ<EFBFBD>ȡ<EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsLoadFromCache
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _IsLoadFromCache;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_IsLoadFromCache = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private double _CacheMinutes = 5;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public double CacheMinutes
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _CacheMinutes;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_CacheMinutes = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ո<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XHtml<6D><6C><EFBFBD>ݣ<EFBFBD>ReadOnly<6C><79>
|
|||
|
|
/// </summary>
|
|||
|
|
public virtual string OutXml
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _XmlDocument.OuterXml;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ص<EFBFBD>Html<6D>Ƿ<EFBFBD><C7B7>Ѹı䣨ReadOnly<6C><79>
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsXHtmlChanged
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return !theCache.Contains(xmlCacheKey);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
///// <summary>
|
|||
|
|
///// <20><><EFBFBD><EFBFBD>Html<6D><6C><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ͽڵ㡣
|
|||
|
|
///// </summary>
|
|||
|
|
//private bool clearCommentOnLoad = false;
|
|||
|
|
static XHtmlBase()
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪDTD<54><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>xhtmlʱת&<26><><EFBFBD><EFBFBD>ת<EFBFBD>塣
|
|||
|
|
// XHtmlUrlResolver.Instance.InitDTD();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public XHtmlBase()
|
|||
|
|
{
|
|||
|
|
_XmlDocument = new XmlDocument();
|
|||
|
|
theCache = DistributedCache.Local;
|
|||
|
|
}
|
|||
|
|
protected void LoadNameSpace(string nameSpace)
|
|||
|
|
{
|
|||
|
|
xnm = new XmlNamespaceManager(_XmlDocument.NameTable);
|
|||
|
|
xnm.AddNamespace(PreXml, nameSpace);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ӿ<EFBFBD><D3BE><EFBFBD>·<EFBFBD><C2B7><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ΪKeyֵ
|
|||
|
|
/// </summary>
|
|||
|
|
private string GenerateKey(string fileName)
|
|||
|
|
{
|
|||
|
|
_FileName = fileName;
|
|||
|
|
string xmlKey = fileName.Replace(AppConfig.WebRootPath, "XHtmlBase_").Replace("/", "").Replace("\\", "");
|
|||
|
|
return xmlKey;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>xml
|
|||
|
|
/// <summary>
|
|||
|
|
/// docTypeHtml<6D><6C>һ<EFBFBD><D2BB><EFBFBD>ġ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
//protected static string docTypeHtml = string.Empty;
|
|||
|
|
//private const string docType = "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>xml<6D>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="xml">xml<6D>ַ<EFBFBD><D6B7><EFBFBD></param>
|
|||
|
|
public void LoadXml(string xml)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (xnm != null)
|
|||
|
|
{
|
|||
|
|
if (xml.StartsWith("<!DOCTYPE html"))
|
|||
|
|
{
|
|||
|
|
//ȥ<><C8A5>DTDͷ<44><CDB7>
|
|||
|
|
xml = xml.Substring(xml.IndexOf('>') + 1).Trim();
|
|||
|
|
//if (xml.Contains("&"))
|
|||
|
|
//{
|
|||
|
|
// if (string.IsNullOrEmpty(docTypeHtml))
|
|||
|
|
// {
|
|||
|
|
// docTypeHtml = "<!DOCTYPE html PUBLIC \" -//W3C//DTD XHTML 1.0 Transitional//EN\" \"" + AppConfig.XHtml.DtdUri + "\">";
|
|||
|
|
// }
|
|||
|
|
// xml = xml.Replace(xml.Substring(0, xml.IndexOf('>') + 1), docTypeHtml);
|
|||
|
|
//}
|
|||
|
|
//else if (xml.StartsWith(docType))
|
|||
|
|
//{
|
|||
|
|
// xml = xml.Replace(xml.Substring(0, xml.IndexOf('>') + 1), "<!DOCTYPE html>");
|
|||
|
|
//}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (xml.IndexOf(AppConfig.XHtml.CDataLeft) == -1)
|
|||
|
|
{
|
|||
|
|
int body = Math.Max(xml.IndexOf("<body"), xml.IndexOf("</head>"));
|
|||
|
|
int scriptStart = xml.IndexOf("<script", body);
|
|||
|
|
if (scriptStart > 0)
|
|||
|
|
{
|
|||
|
|
int scriptEnd = xml.IndexOf("</script>", scriptStart);
|
|||
|
|
while (scriptStart < scriptEnd && scriptStart > 0)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڽű<DABD><C5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><EFBFBD><D7B7>CData
|
|||
|
|
xml = xml.Insert(scriptEnd + 9, AppConfig.XHtml.CDataRight);
|
|||
|
|
xml = xml.Insert(scriptStart, AppConfig.XHtml.CDataLeft);
|
|||
|
|
scriptStart = xml.IndexOf("<script", scriptEnd + 10);
|
|||
|
|
if (scriptStart > 0)
|
|||
|
|
{
|
|||
|
|
scriptEnd = xml.IndexOf("</script>", scriptStart);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
xml = Filter(xml);
|
|||
|
|
_XmlDocument.LoadXml(xml);
|
|||
|
|
}
|
|||
|
|
catch (XmlException err)
|
|||
|
|
{
|
|||
|
|
throw new XmlException(err.Message);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ļ<EFBFBD><C4BC>м<EFBFBD><D0BC><EFBFBD>Xml
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="fileName"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool Load(string fileName)
|
|||
|
|
{
|
|||
|
|
return Load(fileName, XmlCacheLevel.Lower);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>XML
|
|||
|
|
/// </summary>
|
|||
|
|
public bool Load(string fileName, XmlCacheLevel level)
|
|||
|
|
{
|
|||
|
|
return Load(fileName, level, false);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>Xml<6D>ļ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="fileName"><3E>ļ<EFBFBD><C4BC><EFBFBD></param>
|
|||
|
|
/// <param name="level"><3E>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>漶<EFBFBD><E6BCB6></param>
|
|||
|
|
/// <param name="clearCommentNode"><3E><><EFBFBD>غ<EFBFBD><D8BA>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ͽڵ<CDBD></param>
|
|||
|
|
public bool Load(string fileName, XmlCacheLevel level, bool clearCommentNode)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
bool loadState = false;
|
|||
|
|
xmlCacheKey = GenerateKey(fileName);//<2F><>·<EFBFBD><C2B7><EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Ϊkey
|
|||
|
|
if (level != XmlCacheLevel.NoCache)
|
|||
|
|
{
|
|||
|
|
loadState = LoadFromCache(xmlCacheKey);//<2F><>Cache<68><65><EFBFBD><EFBFBD>Xml
|
|||
|
|
}
|
|||
|
|
if (!loadState)//Cache<68><65><EFBFBD><EFBFBD>Xmlʧ<6C><CAA7>
|
|||
|
|
{
|
|||
|
|
_CacheMinutes = (double)level;
|
|||
|
|
loadState = LoadFromFile(fileName, clearCommentNode);//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>Xml
|
|||
|
|
}
|
|||
|
|
return loadState;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD>html
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="key"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public bool LoadFromCache(string key)
|
|||
|
|
{
|
|||
|
|
if (theCache.Contains(key))//<2F><><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ڶ<EFBFBD>Ӧֵ<D3A6><D6B5>key<65>Ķ<EFBFBD><C4B6><EFBFBD>
|
|||
|
|
{
|
|||
|
|
_XmlDocument = null;
|
|||
|
|
var cacheObj = theCache.Get(key) as XmlDocument;
|
|||
|
|
if (_IsReadOnly)
|
|||
|
|
{
|
|||
|
|
_XmlDocument = cacheObj;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
var cloneDoc = GetCloneFrom(cacheObj);
|
|||
|
|
_XmlDocument = cloneDoc;
|
|||
|
|
}
|
|||
|
|
_IsLoadFromCache = true;
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ͽڵ<CDBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public virtual void RemoveCommentNode()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>XML <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>õķ<C3B5><C4B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private bool LoadFromFile(string fileName, bool clearCommentNode)
|
|||
|
|
{
|
|||
|
|
if (!System.IO.File.Exists(fileName))
|
|||
|
|
{
|
|||
|
|
//Log.WriteLog("filename no exist : " + fileName);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
string html = string.Empty;
|
|||
|
|
if (xnm != null)
|
|||
|
|
{
|
|||
|
|
html = IOHelper.ReadAllText(fileName, 0, _Encoding);
|
|||
|
|
//ResolverDtd.Resolver(ref _XmlDocument);//ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DTD<54>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ¼<C4BF><C2BC>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (html != string.Empty)
|
|||
|
|
{
|
|||
|
|
LoadXml(html);//<2F><><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>html
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
_XmlDocument.Load(fileName);//<2F><><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>xml
|
|||
|
|
}
|
|||
|
|
if (clearCommentNode)
|
|||
|
|
{
|
|||
|
|
RemoveCommentNode();
|
|||
|
|
}
|
|||
|
|
xmlCacheKey = GenerateKey(fileName);
|
|||
|
|
if (!theCache.Contains(xmlCacheKey))
|
|||
|
|
{
|
|||
|
|
RefleshCache();
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
catch (Exception err)
|
|||
|
|
{
|
|||
|
|
Error.Throw(err.Message + " FileName : " + fileName);
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD> XmlDocument
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>ǰ XmlDocument <20><><EFBFBD>¼<EFBFBD><C2BC>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void RefleshCache()
|
|||
|
|
{
|
|||
|
|
if (_XmlDocument != null && !string.IsNullOrEmpty(xmlCacheKey))
|
|||
|
|
{
|
|||
|
|
if (IsReadOnly)
|
|||
|
|
{
|
|||
|
|
theCache.Set(xmlCacheKey, _XmlDocument, CacheMinutes, FileName);//<2F><><EFBFBD><EFBFBD>Cache<68><65><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
var cloneDoc = GetCloneFrom(_XmlDocument);
|
|||
|
|
theCache.Set(xmlCacheKey, cloneDoc, CacheMinutes, FileName);//<2F><><EFBFBD><EFBFBD>Cache<68><65><EFBFBD><EFBFBD>Clone
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private XmlDocument GetCloneFrom(XmlDocument xDoc)
|
|||
|
|
{
|
|||
|
|
//if (true || AppConfig.IsNetCore)
|
|||
|
|
//{
|
|||
|
|
//<2F><><EFBFBD>ָ<EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<DEB8>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><DEB8>˻<EFBFBD><CBBB><EFBFBD><EFBFBD>ڵ㡣
|
|||
|
|
XHtmlDocument document = new XHtmlDocument();
|
|||
|
|
|
|||
|
|
////document.CreateNode( XmlNodeType.Element,"aaa"
|
|||
|
|
|
|||
|
|
|
|||
|
|
//XmlElement ele = document.CreateElement("div");
|
|||
|
|
//ele.IsEmpty = false;
|
|||
|
|
|
|||
|
|
//document.AppendChild(ele);
|
|||
|
|
|
|||
|
|
//if (xDoc.DocumentType != null && !AppConfig.IsNetCore)
|
|||
|
|
//{
|
|||
|
|
// XmlNode docType = document.ImportNode(xDoc.DocumentType, false);
|
|||
|
|
// document.AppendChild(docType);
|
|||
|
|
//}
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DTD<54><44><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD>ٶȡ<D9B6>
|
|||
|
|
XmlNode node = document.ImportNode(xDoc.DocumentElement, true);
|
|||
|
|
document.AppendChild(node);
|
|||
|
|
|
|||
|
|
|
|||
|
|
return document as XmlDocument;
|
|||
|
|
//}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// //ASP.NET <20><> bug<75><67><EFBFBD><EFBFBD>clone<6E>ڵ㷽<DAB5><E3B7BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣬<EFBFBD>ڵ㶪ʧ<E3B6AA><CAA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD><D8B6><EFBFBD>ʧ<EFBFBD><CAA7>
|
|||
|
|
// XmlDocument newDoc = new XmlDocument();
|
|||
|
|
// try
|
|||
|
|
// {
|
|||
|
|
// newDoc.LoadXml(xDoc.InnerXml);
|
|||
|
|
// }
|
|||
|
|
// catch (Exception err)
|
|||
|
|
// {
|
|||
|
|
// Log.Write(err, LogType.Error);
|
|||
|
|
// newDoc.InnerXml = xDoc.InnerXml;
|
|||
|
|
// }
|
|||
|
|
// return newDoc;
|
|||
|
|
|
|||
|
|
//}
|
|||
|
|
// int length = xDoc.InnerXml.Length;
|
|||
|
|
// XmlDocument doc = xDoc.CloneNode(true) as XmlDocument;
|
|||
|
|
// if (doc.InnerXml.Length != length)
|
|||
|
|
// {
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// if (this.FileName == "D:\\Code\\taurus.git\\Taurus.MVC\\demo\\default\\Taurus.View\\Views\\Admin\\metric.html")
|
|||
|
|
// {
|
|||
|
|
|
|||
|
|
// }
|
|||
|
|
// //<2F><>¡<EFBFBD>ٶȿ졣
|
|||
|
|
// return xDoc.Clone() as XmlDocument;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>XmlDocument<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="fileName">ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7></param>
|
|||
|
|
public bool Save(string fileName)
|
|||
|
|
{
|
|||
|
|
if (Path.GetFileName(fileName).IndexOfAny(AppConst.InvalidFileNameChars) > -1)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>·<EFBFBD><C2B7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
|
|||
|
|
{
|
|||
|
|
Log.Write("XHtmlBase.Save : InvalidPath : " + fileName, LogType.Error);
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
if (_XmlDocument == null) { return false; }
|
|||
|
|
|
|||
|
|
string html = _XmlDocument.InnerXml;
|
|||
|
|
|
|||
|
|
if (!string.IsNullOrEmpty(html))
|
|||
|
|
{
|
|||
|
|
if (html.Contains(AppConfig.XHtml.DtdUri))
|
|||
|
|
{
|
|||
|
|
html = _XmlDocument.InnerXml.Replace(AppConfig.XHtml.DtdUri, "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd");
|
|||
|
|
}
|
|||
|
|
return IOHelper.Write(fileName, html, _Encoding);
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region XPath <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
protected XmlNode Fill(string xPath, XmlNode parent)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (parent != null)
|
|||
|
|
{
|
|||
|
|
return parent.SelectSingleNode(xPath.Replace("//", "descendant::"), xnm);
|
|||
|
|
}
|
|||
|
|
return _XmlDocument.SelectSingleNode(xPath, xnm);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ѯ<EFBFBD><D1AF><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
protected XmlNodeList Select(string xPath, XmlNode parent)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (parent != null)
|
|||
|
|
{
|
|||
|
|
return parent.SelectNodes(xPath.Replace("//", "descendant::"), xnm);
|
|||
|
|
}
|
|||
|
|
return _XmlDocument.SelectNodes(xPath, xnm);
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ȡ XPath <20>
|
|||
|
|
/// </summary>
|
|||
|
|
protected string GetXPath(string tag, string attr, string value)
|
|||
|
|
{
|
|||
|
|
string xPath = "//" + (xnm != null ? PreXml + ":" : "") + tag; //+ "[@" + attr + "='" + value + "']";
|
|||
|
|
if (!string.IsNullOrEmpty(attr))
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(value))
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>Դ<EFBFBD>Сд<D0A1><D0B4><EFBFBD><EFBFBD>
|
|||
|
|
//xPath += "[@" + attr + "='" + value + "']";
|
|||
|
|
xPath += "[translate(@" + attr + ",'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='" + value.ToLower() + "']";
|
|||
|
|
//xPath += "[@" + attr + "=translate('" + value + "','ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')]";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
xPath += "[@" + attr + "]";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return xPath;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
#region <EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>XML(ʮ<><CAAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ 0x1D)<29><>Ч<EFBFBD><D0A7><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ͬʱ<CDAC>滻><3B><><EFBFBD>ţ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
protected string Filter(string text)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(text))
|
|||
|
|
{
|
|||
|
|
return text;
|
|||
|
|
}
|
|||
|
|
StringBuilder info = new StringBuilder(text.Length + 20);
|
|||
|
|
for (int i = 0; i < text.Length; i++)
|
|||
|
|
{
|
|||
|
|
char c = text[i];
|
|||
|
|
if (((c >= 0) && (c <= 8)) || ((c >= 11) && (c <= 12)) || ((c >= 14) && (c <= 32)))
|
|||
|
|
{
|
|||
|
|
info.AppendFormat(" ", c);//&#x{0:X};
|
|||
|
|
}
|
|||
|
|
else if (c == '&')
|
|||
|
|
{
|
|||
|
|
info.Append("&");
|
|||
|
|
// &(<28><EFBFBD><DFBC><EFBFBD>) &
|
|||
|
|
//<(С<><D0A1>) <
|
|||
|
|
//>(<28><><EFBFBD><EFBFBD>) >
|
|||
|
|
//"(˫<><CBAB><EFBFBD><EFBFBD>) "
|
|||
|
|
//'(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) '
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (i > 50 && i != text.Length - 1)
|
|||
|
|
{
|
|||
|
|
char nc = text[i + 1];
|
|||
|
|
if (c == '<' && nc != '/' && nc != '!' && !IsEnChar(nc)) // <20><>Ӣ<EFBFBD><D3A2><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8>
|
|||
|
|
{
|
|||
|
|
info.Append("<");
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
info.Append(c);
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return info.ToString();
|
|||
|
|
}
|
|||
|
|
private bool IsEnChar(char c)//Ӣ<><D3A2><EFBFBD><EFBFBD>ĸ
|
|||
|
|
{
|
|||
|
|
return (c > 64 && c < 91) || (c > 96 && c < 123);
|
|||
|
|
}
|
|||
|
|
///// <summary>
|
|||
|
|
///// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滻<EFBFBD><E6BBBB>
|
|||
|
|
///// </summary>
|
|||
|
|
//private string RegexReplace(string text)
|
|||
|
|
//{
|
|||
|
|
// Regex regex = new Regex(@"</?[^>]*>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
|||
|
|
// MatchCollection collection = regex.Matches(text);
|
|||
|
|
// foreach (Match mat in collection)
|
|||
|
|
// {
|
|||
|
|
// string value = mat.Value;
|
|||
|
|
// }
|
|||
|
|
// return text;
|
|||
|
|
//}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region SetCData
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>CDATA
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="html"><3E><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public string SetCDATA(string html)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(html))
|
|||
|
|
{
|
|||
|
|
return html;
|
|||
|
|
}
|
|||
|
|
html = html.Replace(AppConfig.XHtml.CDataLeft, string.Empty).Replace(AppConfig.XHtml.CDataRight, string.Empty);
|
|||
|
|
html = html.Replace("<![CDATA[", "<![CDATA[").Replace("]]>", "]]>");
|
|||
|
|
//text = text.Replace(((char)10).ToString(), "<BR>");
|
|||
|
|
//text = text.Replace(((char)13).ToString(), "<BR>");
|
|||
|
|
//text = text.Replace(((char)34).ToString(), """);
|
|||
|
|
//text = text.Replace(((char)39).ToString(), "'");
|
|||
|
|
html = html.Replace("\\", "#!!#").Replace("\0", "#!0!#");
|
|||
|
|
html = Filter(html);
|
|||
|
|
return AppConfig.XHtml.CDataLeft + html + AppConfig.XHtml.CDataRight;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>CDATA
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="html"><3E><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public string ClearCDATA(string html)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(html))
|
|||
|
|
{
|
|||
|
|
return html;
|
|||
|
|
}
|
|||
|
|
if (html.Contains("#!"))
|
|||
|
|
{
|
|||
|
|
html = html.Replace("#!!#", "\\").Replace("#!0!#", "\\0");
|
|||
|
|
}
|
|||
|
|
if (html.Contains(AppConfig.XHtml.CDataLeft))
|
|||
|
|
{
|
|||
|
|
html = html.Replace(AppConfig.XHtml.CDataLeft, string.Empty).Replace(AppConfig.XHtml.CDataRight, string.Empty);
|
|||
|
|
}
|
|||
|
|
return html;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region IDisposable <EFBFBD><EFBFBD>Ա
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ͷ<EFBFBD><CDB7><EFBFBD>Դ
|
|||
|
|
/// </summary>
|
|||
|
|
public virtual void Dispose()
|
|||
|
|
{
|
|||
|
|
if (_XmlDocument != null)
|
|||
|
|
{
|
|||
|
|
//if (!ReadOnly)
|
|||
|
|
//{
|
|||
|
|
//xmlDoc.RemoveAll();
|
|||
|
|
//}
|
|||
|
|
_XmlDocument = null;
|
|||
|
|
//GC.Collect();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|