1499 lines
52 KiB
C#
1499 lines
52 KiB
C#
|
|
using System;
|
|||
|
|
using System.Xml;
|
|||
|
|
using CYQ.Data.Table;
|
|||
|
|
using System.Text.RegularExpressions;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using CYQ.Data.Tool;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Web;
|
|||
|
|
using System.Threading;
|
|||
|
|
using CYQ.Data.Json;
|
|||
|
|
|
|||
|
|
namespace CYQ.Data.Xml
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// Xml/Html<6D><6C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public partial class XHtmlAction : XHtmlBase
|
|||
|
|
{
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD>캯<EFBFBD><EFBFBD>
|
|||
|
|
/// <summary>
|
|||
|
|
/// Ĭ<>Ϲ<EFBFBD><CFB9>캯<EFBFBD><ECBAAF>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƿռ<C6BF><D5BC><EFBFBD>Xml]
|
|||
|
|
/// </summary>
|
|||
|
|
public XHtmlAction()
|
|||
|
|
: base()
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="isForHtml">trueʱ<65><CAB1><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>html<6D><6C><EFBFBD><EFBFBD><EFBFBD>ƿռ<C6BF>(http://www.w3.org/1999/xhtml)</param>
|
|||
|
|
public XHtmlAction(bool isForHtml)
|
|||
|
|
: base()
|
|||
|
|
{
|
|||
|
|
if (isForHtml)
|
|||
|
|
{
|
|||
|
|
base.LoadNameSpace(htmlNameSpace);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="isForHtml">trueʱ<65><CAB1><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>html<6D><6C><EFBFBD><EFBFBD><EFBFBD>ƿռ<C6BF>(http://www.w3.org/1999/xhtml)</param>
|
|||
|
|
/// <param name="isReadOnly">trueʱ<65>ĵ<EFBFBD>ӦΪֻ<CEAA><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ͬһ<CDAC><D2BB><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ã<EFBFBD>falseʱ<65>ĵ<EFBFBD><C4B5><EFBFBD>д<EFBFBD><D0B4>ÿ<EFBFBD>λ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>¡һ<C2A1><D2BB><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>ء<EFBFBD></param>
|
|||
|
|
public XHtmlAction(bool isForHtml, bool isReadOnly)
|
|||
|
|
: base()
|
|||
|
|
{
|
|||
|
|
if (isForHtml)
|
|||
|
|
{
|
|||
|
|
base.LoadNameSpace(htmlNameSpace);
|
|||
|
|
}
|
|||
|
|
IsReadOnly = isReadOnly;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="nameSpaceUrl"><3E><>Xml<6D><6C><EFBFBD><EFBFBD><EFBFBD>ƿռ<C6BF>[<5B><><EFBFBD><EFBFBD>]</param>
|
|||
|
|
public XHtmlAction(string nameSpaceUrl)
|
|||
|
|
: base()
|
|||
|
|
{
|
|||
|
|
base.LoadNameSpace(nameSpaceUrl);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD>ѯ
|
|||
|
|
/// <summary>
|
|||
|
|
/// GetByID or GetByName
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="idOrName">id or name</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public XmlNode Get(string idOrName)
|
|||
|
|
{
|
|||
|
|
return Get(idOrName, null);
|
|||
|
|
}
|
|||
|
|
public XmlNode Get(string idOrName, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
XmlNode node = GetByID(idOrName, parentNode);
|
|||
|
|
if (node == null)
|
|||
|
|
{
|
|||
|
|
node = GetByName(idOrName, parentNode);
|
|||
|
|
if (node == null)
|
|||
|
|
{
|
|||
|
|
switch (idOrName.ToLower())
|
|||
|
|
{
|
|||
|
|
case "head":
|
|||
|
|
case "body":
|
|||
|
|
case "title":
|
|||
|
|
case "form":
|
|||
|
|
case "style":
|
|||
|
|
case "meta":
|
|||
|
|
case "link":
|
|||
|
|
case "script":
|
|||
|
|
XmlNodeList xList = GetList(idOrName.ToLower(), parentNode);
|
|||
|
|
if (xList != null)
|
|||
|
|
{
|
|||
|
|
node = xList[0];
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return node;
|
|||
|
|
}
|
|||
|
|
public XmlNode GetByID(string id)
|
|||
|
|
{
|
|||
|
|
return Fill(GetXPath("*", "id", id), null);
|
|||
|
|
}
|
|||
|
|
public XmlNode GetByID(string id, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
return Fill(GetXPath("*", "id", id), parentNode);
|
|||
|
|
}
|
|||
|
|
public XmlNode GetByName(string name)
|
|||
|
|
{
|
|||
|
|
return Fill(GetXPath("*", "name", name), null);
|
|||
|
|
}
|
|||
|
|
public XmlNode GetByName(string name, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
return Fill(GetXPath("*", "name", name), parentNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public XmlNode Get(string tag, string attr, string value, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
return Fill(GetXPath(tag, attr, value), parentNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public XmlNodeList GetList(string tag, string attr, string value)
|
|||
|
|
{
|
|||
|
|
return Select(GetXPath(tag, attr, value), null);
|
|||
|
|
}
|
|||
|
|
public XmlNodeList GetList(string tag, string attr, string value, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
return Select(GetXPath(tag, attr, value), parentNode);
|
|||
|
|
}
|
|||
|
|
public XmlNodeList GetList(string tag, string attr)
|
|||
|
|
{
|
|||
|
|
return Select(GetXPath(tag, attr, null), null);
|
|||
|
|
}
|
|||
|
|
public XmlNodeList GetList(string tag, string attr, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
return Select(GetXPath(tag, attr, null), parentNode);
|
|||
|
|
}
|
|||
|
|
public XmlNodeList GetList(string tag)
|
|||
|
|
{
|
|||
|
|
return Select(GetXPath(tag, null, null), null);
|
|||
|
|
}
|
|||
|
|
public XmlNodeList GetList(string tag, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
return Select(GetXPath(tag, null, null), parentNode);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
protected XmlElement Create(string tag)
|
|||
|
|
{
|
|||
|
|
if (xnm == null)
|
|||
|
|
{
|
|||
|
|
return _XmlDocument.CreateElement(tag);
|
|||
|
|
}
|
|||
|
|
return _XmlDocument.CreateElement(tag, xnm.LookupNamespace(PreXml));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void CreateNodeTo(XmlNode parentNode, string tag, string text, params string[] attrAndValue)
|
|||
|
|
{
|
|||
|
|
if (parentNode != null)
|
|||
|
|
{
|
|||
|
|
parentNode.AppendChild(CreateNode(tag, text, attrAndValue));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public XmlNode CreateNode(string tag, string text, params string[] attrAndValue)
|
|||
|
|
{
|
|||
|
|
XmlElement xElement = Create(tag);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(text))
|
|||
|
|
{
|
|||
|
|
if (text.Contains("<") && text.Contains(">"))
|
|||
|
|
{
|
|||
|
|
xElement.InnerXml = text;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
xElement.InnerText = text;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
xElement.InnerText = SetCDATA(text);
|
|||
|
|
}
|
|||
|
|
if (attrAndValue != null && attrAndValue.Length % 2 == 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < attrAndValue.Length; i++)
|
|||
|
|
{
|
|||
|
|
string attr = attrAndValue[i];
|
|||
|
|
i++;
|
|||
|
|
string value = attrAndValue[i];
|
|||
|
|
xElement.SetAttribute(attr, value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return xElement as XmlNode;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public void AppendNode(XmlNode parentNode, XmlNode childNode)
|
|||
|
|
{
|
|||
|
|
if (parentNode != null && childNode != null)
|
|||
|
|
{
|
|||
|
|
parentNode.AppendChild(childNode);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ӽڵ<D3BD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="position">parentNode<64>ĵ<EFBFBD>N<EFBFBD><4E><EFBFBD>ӽڵ<D3BD>֮<EFBFBD><D6AE></param>
|
|||
|
|
public void AppendNode(XmlNode parentNode, XmlNode childNode, int position)
|
|||
|
|
{
|
|||
|
|
if (parentNode != null && childNode != null)// A B
|
|||
|
|
{
|
|||
|
|
if (parentNode.ChildNodes.Count == 0 || position >= parentNode.ChildNodes.Count)
|
|||
|
|
{
|
|||
|
|
parentNode.AppendChild(childNode);
|
|||
|
|
}
|
|||
|
|
else if (position == 0)
|
|||
|
|
{
|
|||
|
|
InsertBefore(childNode, parentNode.ChildNodes[0]);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
InsertAfter(childNode, parentNode.ChildNodes[position - 1]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region ɾ<EFBFBD><EFBFBD>
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void Clear(XmlNode node)
|
|||
|
|
{
|
|||
|
|
node.RemoveAll();
|
|||
|
|
}
|
|||
|
|
public void Remove(XmlNode node)
|
|||
|
|
{
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
node.ParentNode.RemoveChild(node);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void Remove(string idOrName)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName);
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
node.ParentNode.RemoveChild(node);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void RemoveAllChild(XmlNode node)
|
|||
|
|
{
|
|||
|
|
RemoveChild(node, 0);
|
|||
|
|
}
|
|||
|
|
public void RemoveAllChild(string idOrName)
|
|||
|
|
{
|
|||
|
|
RemoveChild(idOrName, 0);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD><C6B3>ӽڵ<D3BD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="id"><3E>ڵ<EFBFBD><DAB5><EFBFBD>id</param>
|
|||
|
|
/// <param name="start"><3E>ӵڼ<D3B5><DABC><EFBFBD><EFBFBD>ӽڵ㿪ʼɾ<CABC><C9BE>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʼ]</param>
|
|||
|
|
public void RemoveChild(string idOrName, int start)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName);
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
RemoveChild(node, start);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD><C6B3>ӽڵ<D3BD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node"><3E>ڵ<EFBFBD></param>
|
|||
|
|
/// <param name="start"><3E>ӵڼ<D3B5><DABC><EFBFBD><EFBFBD>ӽڵ㿪ʼɾ<CABC><C9BE>[<5B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30>ʼ]</param>
|
|||
|
|
public void RemoveChild(XmlNode node, int start)
|
|||
|
|
{
|
|||
|
|
if (start == 0)
|
|||
|
|
{
|
|||
|
|
node.InnerXml = "";
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (node.ChildNodes.Count > start) //1<><31><EFBFBD>ӽڵ<D3BD>, 0
|
|||
|
|
{
|
|||
|
|
for (int i = node.ChildNodes.Count - 1; i >= start; i--)
|
|||
|
|
{
|
|||
|
|
node.RemoveChild(node.ChildNodes[i]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="ids">Ҫ<>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD></param>
|
|||
|
|
public void RemoveAttrList(params string[] attrNames)
|
|||
|
|
{
|
|||
|
|
XmlNodeList nodeList = null;
|
|||
|
|
foreach (string name in attrNames)
|
|||
|
|
{
|
|||
|
|
nodeList = GetList("*", name);
|
|||
|
|
if (nodeList != null && nodeList.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < nodeList.Count; i++)
|
|||
|
|
{
|
|||
|
|
nodeList[i].Attributes.Remove(nodeList[i].Attributes[name]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>Ƴ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="attrName"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <param name="excludeSetType"><3E>ų<EFBFBD><C5B3>Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
public void RemoveAttrList(string attrName, SetType excludeSetType)
|
|||
|
|
{
|
|||
|
|
XmlNodeList nodeList = GetList("*", attrName);
|
|||
|
|
if (nodeList != null && nodeList.Count > 0)
|
|||
|
|
{
|
|||
|
|
XmlNode node = null;
|
|||
|
|
string setType = excludeSetType.ToString().ToLower();
|
|||
|
|
for (int i = 0; i < nodeList.Count; i++)
|
|||
|
|
{
|
|||
|
|
node = nodeList[i];
|
|||
|
|
if (node.Name != setType)
|
|||
|
|
{
|
|||
|
|
node.Attributes.Remove(node.Attributes[attrName]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD>ע<EFBFBD>ͽڵ<CDBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="node"><3E>Ƴ<EFBFBD><C6B3>˽ڵ<CBBD><DAB5><EFBFBD>ע<EFBFBD><D7A2><EFBFBD>ı<EFBFBD></param>
|
|||
|
|
public void RemoveCommentNode(XmlNode node)
|
|||
|
|
{
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
XmlNodeList xmlNodeList = Select("//comment()", node);
|
|||
|
|
|
|||
|
|
foreach (XmlNode xNode in xmlNodeList)
|
|||
|
|
{
|
|||
|
|
xNode.ParentNode.RemoveChild(xNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƴ<EFBFBD>ע<EFBFBD>ͽڵ<CDBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public override void RemoveCommentNode()
|
|||
|
|
{
|
|||
|
|
RemoveCommentNode(XmlDoc.DocumentElement);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>ڵ㽻<DAB5><E3BDBB>λ<EFBFBD><CEBB>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="xNodeFirst"><3E><>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD></param>
|
|||
|
|
/// <param name="xNodeLast"><3E>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ڵ<EFBFBD></param>
|
|||
|
|
public void InterChange(XmlNode xNodeFirst, XmlNode xNodeLast)
|
|||
|
|
{
|
|||
|
|
if (xNodeFirst != null && xNodeLast != null)
|
|||
|
|
{
|
|||
|
|
if (xNodeFirst.ParentNode != null && xNodeLast.ParentNode != null)
|
|||
|
|
{
|
|||
|
|
xNodeFirst.ParentNode.ReplaceChild(xNodeLast.Clone(), xNodeFirst);
|
|||
|
|
xNodeLast.ParentNode.ReplaceChild(xNodeFirst.Clone(), xNodeLast);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
_XmlDocument.DocumentElement.ReplaceChild(xNodeLast.Clone(), xNodeFirst);
|
|||
|
|
_XmlDocument.DocumentElement.ReplaceChild(xNodeFirst.Clone(), xNodeLast);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void ReplaceNode(XmlNode newNode, string oldNodeIDorName)
|
|||
|
|
{
|
|||
|
|
ReplaceNode(newNode, Get(oldNodeIDorName));
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ڵ<EFBFBD><DAB5>滻[֧<><D6A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD>滻]
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="newNode"><3E>µ<EFBFBD><C2B5><EFBFBD><EFBFBD>ݽڵ<DDBD></param>
|
|||
|
|
/// <param name="oldNode"><3E>ɵĽڵ<C4BD></param>
|
|||
|
|
public void ReplaceNode(XmlNode newNode, XmlNode oldNode)
|
|||
|
|
{
|
|||
|
|
if (newNode != null && oldNode != null)
|
|||
|
|
{
|
|||
|
|
//oldNode = newNode.Clone();
|
|||
|
|
if (newNode.Name == oldNode.Name) // <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC>
|
|||
|
|
{
|
|||
|
|
oldNode.RemoveAll();//<2F><><EFBFBD>վɽڵ<C9BD>
|
|||
|
|
oldNode.InnerXml = newNode.InnerXml;
|
|||
|
|
XmlAttributeCollection attrs = newNode.Attributes;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (attrs != null && attrs.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < attrs.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (attrs[i].Name == "xml:space") { continue; }
|
|||
|
|
((XmlElement)oldNode).SetAttribute(attrs[i].Name, attrs[i].Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
XmlNode xNode = CreateNode(newNode.Name, newNode.InnerXml);//<2F>ȴ<EFBFBD><C8B4><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ㡣
|
|||
|
|
XmlAttributeCollection attrs = newNode.Attributes;
|
|||
|
|
if (attrs != null && attrs.Count > 0)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < attrs.Count; i++)
|
|||
|
|
{
|
|||
|
|
((XmlElement)xNode).SetAttribute(attrs[i].Name, attrs[i].Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
oldNode.ParentNode.InsertAfter(xNode, oldNode);//<2F><><EFBFBD>ھɽڵ<C9BD><DAB5><EFBFBD><EFBFBD>档
|
|||
|
|
Remove(oldNode);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ڵ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>[֧<><D6A7><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>]
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="newNode">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½ڵ<C2BD></param>
|
|||
|
|
/// <param name="refNode"><3E>ڴ˽ڵ<CBBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>NewNode<64>ڵ<EFBFBD></param>
|
|||
|
|
public void InsertAfter(XmlNode newNode, XmlNode refNode)
|
|||
|
|
{
|
|||
|
|
XmlNode xDocNode = CreateNode(newNode.Name, "");
|
|||
|
|
ReplaceNode(newNode, xDocNode);
|
|||
|
|
refNode.ParentNode.InsertAfter(xDocNode, refNode);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ڵ<EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD>[֧<><D6A7><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>]
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="newNode">Ҫ<><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½ڵ<C2BD></param>
|
|||
|
|
/// <param name="refNode"><3E>ڴ˽ڵ<CBBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>NewNode<64>ڵ<EFBFBD></param>
|
|||
|
|
public void InsertBefore(XmlNode newNode, XmlNode refNode)
|
|||
|
|
{
|
|||
|
|
XmlNode xDocNode = CreateNode(newNode.Name, "");
|
|||
|
|
ReplaceNode(newNode, xDocNode);
|
|||
|
|
refNode.ParentNode.InsertBefore(xDocNode, refNode);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD>ڵ<EFBFBD><EFBFBD>ж<EFBFBD>
|
|||
|
|
public bool Contains(string idOrName)
|
|||
|
|
{
|
|||
|
|
return Get(idOrName) != null;
|
|||
|
|
}
|
|||
|
|
public bool Contains(string idOrName, XmlNode parentNode)
|
|||
|
|
{
|
|||
|
|
return Get(idOrName, parentNode) != null;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>/ȡֵ
|
|||
|
|
|
|||
|
|
public bool HasAttr(string idOrName, string attrName)
|
|||
|
|
{
|
|||
|
|
return GetAttrValue(idOrName, attrName) != string.Empty;
|
|||
|
|
}
|
|||
|
|
public bool HasAttr(XmlNode node, string attrName)
|
|||
|
|
{
|
|||
|
|
return GetAttrValue(node, attrName) != string.Empty;
|
|||
|
|
}
|
|||
|
|
public string GetAttrValue(string idOrName, string attrName, params string[] defaultValue)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName);
|
|||
|
|
return GetAttrValue(node, attrName, defaultValue);
|
|||
|
|
}
|
|||
|
|
public string GetAttrValue(XmlNode node, string attrName, params string[] defaultValue)
|
|||
|
|
{
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
switch (attrName)
|
|||
|
|
{
|
|||
|
|
case "InnerText":
|
|||
|
|
if (!string.IsNullOrEmpty(node.InnerText))
|
|||
|
|
{
|
|||
|
|
return node.InnerText;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case "InnerXml":
|
|||
|
|
if (!string.IsNullOrEmpty(node.InnerXml))
|
|||
|
|
{
|
|||
|
|
return node.InnerXml;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
if (node.Attributes != null && node.Attributes[attrName] != null)
|
|||
|
|
{
|
|||
|
|
return node.Attributes[attrName].Value;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (defaultValue.Length > 0)
|
|||
|
|
{
|
|||
|
|
return defaultValue[0];
|
|||
|
|
}
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
public void RemoveAttr(string idOrName, params string[] attrNames)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName);
|
|||
|
|
RemoveAttr(node, attrNames);
|
|||
|
|
}
|
|||
|
|
public void RemoveAttr(XmlNode node, params string[] attrNames)
|
|||
|
|
{
|
|||
|
|
if (node != null && node.Attributes != null)
|
|||
|
|
{
|
|||
|
|
foreach (string name in attrNames)
|
|||
|
|
{
|
|||
|
|
if (node.Attributes[name] != null)
|
|||
|
|
{
|
|||
|
|
node.Attributes.Remove(node.Attributes[name]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
private bool _IsCurrentLang = true;
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>û<EFBFBD><C3BB><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsCurrentLang
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
return _IsCurrentLang;
|
|||
|
|
}
|
|||
|
|
set
|
|||
|
|
{
|
|||
|
|
_IsCurrentLang = value;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD>ʼ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Էָ<D4B7>(<28>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>[#langsplit])
|
|||
|
|
/// </summary>
|
|||
|
|
public bool IsUseLangSplit = true;
|
|||
|
|
|
|||
|
|
private string SetValue(string sourceValue, string newValue, bool addCData)
|
|||
|
|
{
|
|||
|
|
if (string.IsNullOrEmpty(newValue))
|
|||
|
|
{
|
|||
|
|
return sourceValue;
|
|||
|
|
}
|
|||
|
|
newValue = newValue.Replace(ValueReplace.Source, sourceValue);
|
|||
|
|
if (IsUseLangSplit)
|
|||
|
|
{
|
|||
|
|
int split = newValue.IndexOf(ValueReplace.LangSplit);
|
|||
|
|
if (split > -1)
|
|||
|
|
{
|
|||
|
|
newValue = _IsCurrentLang ? newValue.Substring(0, split) : newValue.Substring(split + ValueReplace.LangSplit.Length);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (addCData)
|
|||
|
|
{
|
|||
|
|
newValue = SetCDATA(newValue);
|
|||
|
|
}
|
|||
|
|
return newValue;
|
|||
|
|
}
|
|||
|
|
private void SetAttrValue(XmlNode node, string key, string value)
|
|||
|
|
{
|
|||
|
|
if (node == null || node.Attributes == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (node.Attributes[key] == null)
|
|||
|
|
{
|
|||
|
|
XmlAttribute attr = _XmlDocument.CreateAttribute(key);
|
|||
|
|
node.Attributes.Append(attr);
|
|||
|
|
}
|
|||
|
|
value = SetValue(node.Attributes[key].InnerXml, value, false);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
node.Attributes[key].Value = value;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
node.Attributes[key].Value = SetCDATA(value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Ϊ<>ڵ㸳ֵ[ͨ<><CDA8>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>values<65>и<EFBFBD>ֵ]
|
|||
|
|
/// </summary>
|
|||
|
|
public void Set(XmlNode node, SetType setType, params string[] values)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (node != null && values != null)
|
|||
|
|
{
|
|||
|
|
switch (setType)
|
|||
|
|
{
|
|||
|
|
case SetType.InnerText:
|
|||
|
|
string value = SetValue(node.InnerText, values[0], false);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
node.InnerText = value;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
node.InnerText = SetCDATA(value);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case SetType.InnerXml:
|
|||
|
|
node.InnerXml = SetValue(node.InnerXml, values[0], true);
|
|||
|
|
break;
|
|||
|
|
case SetType.Value:
|
|||
|
|
case SetType.Href:
|
|||
|
|
case SetType.Src:
|
|||
|
|
case SetType.Class:
|
|||
|
|
case SetType.Disabled:
|
|||
|
|
case SetType.ID:
|
|||
|
|
case SetType.Name:
|
|||
|
|
case SetType.Visible:
|
|||
|
|
case SetType.Title:
|
|||
|
|
case SetType.Style:
|
|||
|
|
case SetType.ClearFlag:
|
|||
|
|
string key = setType.ToString().ToLower();
|
|||
|
|
SetAttrValue(node, key, values[0]);
|
|||
|
|
break;
|
|||
|
|
case SetType.Custom:
|
|||
|
|
for (int i = 0; i < values.Length; i++)
|
|||
|
|
{
|
|||
|
|
if (i > 0 && i % 2 == 1)
|
|||
|
|
{
|
|||
|
|
key = values[i - 1].ToLower();
|
|||
|
|
switch (key)
|
|||
|
|
{
|
|||
|
|
case "innertext":
|
|||
|
|
Set(node, SetType.InnerText, values[i]);
|
|||
|
|
break;
|
|||
|
|
case "innerhtml":
|
|||
|
|
case "innerxml":
|
|||
|
|
Set(node, SetType.InnerXml, values[i]);
|
|||
|
|
break;
|
|||
|
|
default:
|
|||
|
|
SetAttrValue(node, key, values[i]);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
break;
|
|||
|
|
case SetType.A:
|
|||
|
|
node.InnerXml = SetValue(node.InnerXml, values[0], true);
|
|||
|
|
if (values.Length > 1)
|
|||
|
|
{
|
|||
|
|
SetAttrValue(node, "href", values[1]);
|
|||
|
|
if (values.Length > 2)
|
|||
|
|
{
|
|||
|
|
SetAttrValue(node, "title", values[2]);
|
|||
|
|
if (values.Length > 3)
|
|||
|
|
{
|
|||
|
|
SetAttrValue(node, "target", values[3]);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case SetType.Select:
|
|||
|
|
if (!node.InnerXml.StartsWith("<"))//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
string innerHtml = node.InnerXml.Replace(string.Format("value=\"{0}\"", values[0]), string.Format("selected=\"selected\" value=\"{0}\"", values[0]));
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
node.InnerText = innerHtml;
|
|||
|
|
//node.InnerXml = innerHtml;
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
node.InnerXml = SetCDATA(innerHtml);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
string lowerValue = values[0].ToLower();
|
|||
|
|
foreach (XmlNode option in node.ChildNodes)
|
|||
|
|
{
|
|||
|
|
string opValue = option.InnerText.ToLower();
|
|||
|
|
if (option.Attributes["value"] != null)
|
|||
|
|
{
|
|||
|
|
opValue = option.Attributes["value"].Value.Split(',')[0].ToLower();
|
|||
|
|
}
|
|||
|
|
if (opValue == lowerValue || opValue == (lowerValue == "true" ? "1" : (lowerValue == "false" ? "0" : lowerValue)))
|
|||
|
|
{
|
|||
|
|
SetAttrValue(option, "selected", "selected");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case SetType.Checked:
|
|||
|
|
string type = GetAttrValue(node, "type");
|
|||
|
|
if (node.Name == "input" && type == "radio")
|
|||
|
|
{
|
|||
|
|
values[0] = "1";
|
|||
|
|
}
|
|||
|
|
switch (values[0].ToLower())
|
|||
|
|
{
|
|||
|
|
case "1":
|
|||
|
|
case "true":
|
|||
|
|
case "check":
|
|||
|
|
case "checked":
|
|||
|
|
key = setType.ToString().ToLower();
|
|||
|
|
SetAttrValue(node, key, key);
|
|||
|
|
break;
|
|||
|
|
case "0":
|
|||
|
|
case "false":
|
|||
|
|
if (type == "checkbox")
|
|||
|
|
{
|
|||
|
|
RemoveAttr(node, setType.ToString().ToLower());
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void Set(string idOrName, SetType setType, params string[] values)
|
|||
|
|
{
|
|||
|
|
Set(null, idOrName, setType, values);
|
|||
|
|
}
|
|||
|
|
public void Set(XmlNode parentNode, string idOrName, SetType setType, params string[] values)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName, parentNode);
|
|||
|
|
Set(node, setType, values);
|
|||
|
|
}
|
|||
|
|
public void Set(string idOrName, string value)
|
|||
|
|
{
|
|||
|
|
Set(null, idOrName, value);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Խڵ㸳ֵ<E3B8B3><D6B5><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>hidden<65><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽڵ㸳ֵ<E3B8B3><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ط<EFBFBD><D8B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="idOrName"></param>
|
|||
|
|
/// <param name="value"></param>
|
|||
|
|
public void Set(XmlNode parentNode, string idOrName, string value)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName, parentNode);
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
SetType setType = SetType.InnerXml;
|
|||
|
|
switch (node.Name)
|
|||
|
|
{
|
|||
|
|
case "input":
|
|||
|
|
switch (GetAttrValue(node, "type"))
|
|||
|
|
{
|
|||
|
|
case "hidden":
|
|||
|
|
return;//<2F>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
case "checkbox":
|
|||
|
|
setType = SetType.Checked; break;
|
|||
|
|
case "image":
|
|||
|
|
setType = SetType.Src; break;
|
|||
|
|
case "radio"://<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
|
|||
|
|
XmlNodeList nodeList = GetList("input", "type", "radio");
|
|||
|
|
for (int i = 0; i < nodeList.Count; i++)
|
|||
|
|
{
|
|||
|
|
if (GetAttrValue(nodeList[i], "name") == idOrName)
|
|||
|
|
{
|
|||
|
|
RemoveAttr(nodeList[i], "checked");
|
|||
|
|
if (GetAttrValue(nodeList[i], "value") == value)
|
|||
|
|
{
|
|||
|
|
node = nodeList[i];
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
setType = SetType.Checked; break;
|
|||
|
|
default:
|
|||
|
|
setType = SetType.Value;
|
|||
|
|
break;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
case "select":
|
|||
|
|
setType = SetType.Select; break;
|
|||
|
|
case "a":
|
|||
|
|
setType = SetType.Href; break;
|
|||
|
|
case "img":
|
|||
|
|
setType = SetType.Src; break;
|
|||
|
|
}
|
|||
|
|
//try
|
|||
|
|
//{
|
|||
|
|
Set(node, setType, value);
|
|||
|
|
//}
|
|||
|
|
//catch (Exception err)
|
|||
|
|
//{
|
|||
|
|
|
|||
|
|
// throw;
|
|||
|
|
//}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OutXml
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Xml<6D><6C><EFBFBD>ݡ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public override string OutXml
|
|||
|
|
{
|
|||
|
|
get
|
|||
|
|
{
|
|||
|
|
if (_XmlDocument != null)
|
|||
|
|
{
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>clearflag<EFBFBD><EFBFBD>ǩ
|
|||
|
|
string key = "clearflag";
|
|||
|
|
XmlNodeList xnl = GetList("*", key);
|
|||
|
|
if (xnl != null)
|
|||
|
|
{
|
|||
|
|
XmlNode xNode = null;
|
|||
|
|
for (int i = xnl.Count - 1; i >= 0; i--)
|
|||
|
|
{
|
|||
|
|
xNode = xnl[i];
|
|||
|
|
switch (GetAttrValue(xnl[i], key))
|
|||
|
|
{
|
|||
|
|
case "0":
|
|||
|
|
RemoveAttr(xNode, key);
|
|||
|
|
xNode.InnerXml = "";
|
|||
|
|
break;
|
|||
|
|
case "1":
|
|||
|
|
Remove(xNode);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>XHtml ͷǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CData
|
|||
|
|
|
|||
|
|
string html = _XmlDocument.InnerXml;
|
|||
|
|
if (html.Contains(".dtd\"[]>"))
|
|||
|
|
{
|
|||
|
|
html = html.Replace(".dtd\"[]>", ".dtd\">");
|
|||
|
|
}
|
|||
|
|
if (html.Contains(" xmlns="))
|
|||
|
|
{
|
|||
|
|
html = html.Replace(" xmlns=\"\"", string.Empty).Replace(" xmlns=\"" + xnm.LookupNamespace(PreXml) + "\"", string.Empty);
|
|||
|
|
}
|
|||
|
|
if (html.Contains("&"))
|
|||
|
|
{
|
|||
|
|
//<2F>Ȱ<EFBFBD>&<26><><EFBFBD><EFBFBD><EFBFBD>滻<EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滻<EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD>ġ<EFBFBD>
|
|||
|
|
html = html.Replace("&", "&").Replace(">", ">").Replace("<", "<");//html<6D><6C>ǩ<EFBFBD><C7A9><EFBFBD>š<EFBFBD>
|
|||
|
|
}
|
|||
|
|
//if (!string.IsNullOrEmpty(docTypeHtml))
|
|||
|
|
//{
|
|||
|
|
// html = html.Replace(docTypeHtml, "<!DOCTYPE html>");
|
|||
|
|
//}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռλ<EFBFBD><EFBFBD><EFBFBD>滻
|
|||
|
|
if (html.IndexOf("${") > -1 || html.IndexOf("<%#") > -1)
|
|||
|
|
{
|
|||
|
|
html = FormatHtml(html, null);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CData<EFBFBD><EFBFBD>ǩ
|
|||
|
|
html = ClearCDATA(html);
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
if (html.StartsWith("<html"))
|
|||
|
|
{
|
|||
|
|
//<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD>XmlDocumentʱ<74><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dtd<74><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>
|
|||
|
|
html = "<!DOCTYPE html>" + html;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return html;
|
|||
|
|
}
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>Html<6D><6C><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD>б<EFBFBD>ǩ<EFBFBD>滻<EFBFBD><E6BBBB>1<EFBFBD><31><EFBFBD>滻<EFBFBD><E6BBBB>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="html"><3E><>Ҫ<EFBFBD><D2AA><EFBFBD>滻<EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <param name="values"><3E><><EFBFBD><EFBFBD>ֵ<EFBFBD>滻<EFBFBD><E6BBBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
private string FormatHtml(string html, MDictionary<string, string> values)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
if (html.IndexOf("${") > -1)
|
|||
|
|
{
|
|||
|
|
#region <EFBFBD>滻ռλ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
MatchCollection matchs = Regex.Matches(html, @"\$\{([\S\s]*?)\}", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
|||
|
|
if (matchs != null && matchs.Count > 0)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
|
|||
|
|
List<string> keys = new List<string>(matchs.Count);
|
|||
|
|
foreach (Match match in matchs)
|
|||
|
|
{
|
|||
|
|
//ԭʼ<D4AD><CABC>ռλ<D5BC><CEBB> ${txt#name:xx#xx}
|
|||
|
|
string value = match.Groups[0].Value;//${txt#name:xx#xx}<7D><>${'aaa'+txt#name:xx#xx+'bbb'}
|
|||
|
|
if (string.IsNullOrEmpty(value) || keys.Contains(value))
|
|||
|
|
{
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
keys.Add(value);
|
|||
|
|
|
|||
|
|
#region <EFBFBD>ֽ<EFBFBD>ռλ<EFBFBD><EFBFBD>
|
|||
|
|
//<2F>ȴ<EFBFBD><C8B4><EFBFBD>+<2B><> ${'aaa'+txt#name:xx#xx+'bbb'} formatter= 'aaa'{0}
|
|||
|
|
string formatter = "", key = "";
|
|||
|
|
string[] items = match.Groups[1].Value.Trim().Split('+');//['aa',txt#name]
|
|||
|
|
foreach (string item in items)
|
|||
|
|
{
|
|||
|
|
if (item[0] == '"')
|
|||
|
|
{
|
|||
|
|
formatter += item.Trim('"');
|
|||
|
|
}
|
|||
|
|
else if (item[0] == '\'')
|
|||
|
|
{
|
|||
|
|
formatter += item.Trim('\'');
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (!string.IsNullOrEmpty(key))
|
|||
|
|
{
|
|||
|
|
break;//ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>key : txt#name:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
formatter += "{0}";
|
|||
|
|
key = item.Trim();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
string columnName = key.Split(':')[0];//name
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
string replaceValue = "";
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD>ȡռλ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
|
if (values != null)
|
|||
|
|
{
|
|||
|
|
replaceValue = GetValue1(columnName, values);
|
|||
|
|
}
|
|||
|
|
if (string.IsNullOrEmpty(replaceValue))
|
|||
|
|
{
|
|||
|
|
replaceValue = GetValueByKeyValue2(columnName);
|
|||
|
|
}
|
|||
|
|
if (string.IsNullOrEmpty(replaceValue))
|
|||
|
|
{
|
|||
|
|
replaceValue = GetValueByRequest3(columnName, key);
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
html = html.Replace(value, string.IsNullOrEmpty(replaceValue) ? "" : string.Format(formatter, replaceValue));
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
keys.Clear();
|
|||
|
|
keys = null;
|
|||
|
|
matchs = null;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
if (html.IndexOf("<%#") > -1)//js eval ִ<><D6B4>
|
|||
|
|
{
|
|||
|
|
#region <EFBFBD>滻JavaScript<EFBFBD>
|
|||
|
|
MatchCollection matchs = Regex.Matches(html, @"<%#([\S\s]*?)%>", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
|||
|
|
if (matchs != null && matchs.Count > 0)
|
|||
|
|
{
|
|||
|
|
foreach (Match match in matchs)
|
|||
|
|
{
|
|||
|
|
//ԭʼ<D4AD><CABC>ռλ<D5BC><CEBB>
|
|||
|
|
string value = match.Groups[0].Value;//${txt#name:xx#xx}<7D><>${'aaa'+txt#name:xx#xx+'bbb'}
|
|||
|
|
string value1 = match.Groups[1].Value;
|
|||
|
|
string evalValue = null;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
evalValue = Convert.ToString(Microsoft.JScript.Eval.JScriptEvaluate(value1, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()));
|
|||
|
|
}
|
|||
|
|
catch (Exception err)
|
|||
|
|
{
|
|||
|
|
Log.WriteLogToTxt(err, LogType.Error);
|
|||
|
|
}
|
|||
|
|
html = html.Replace(value, evalValue);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return html;
|
|||
|
|
}
|
|||
|
|
private string GetValue1(string columnName, MDictionary<string, string> values)//, MDataRow row
|
|||
|
|
{
|
|||
|
|
if (values.ContainsKey(columnName))//ֵ<><D6B5><EFBFBD>ܱ<EFBFBD><DCB1><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡֵ<C8A1><D6B5>
|
|||
|
|
{
|
|||
|
|
return values[columnName];
|
|||
|
|
}
|
|||
|
|
else if (columnName.Length < 3)
|
|||
|
|
{
|
|||
|
|
int i = 0;
|
|||
|
|
if (int.TryParse(columnName, out i) && i < values.Count)
|
|||
|
|
{
|
|||
|
|
return values[i]; //<2F><><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//else
|
|||
|
|
//{
|
|||
|
|
// MDataCell matchCell = row[columnName];
|
|||
|
|
// if (matchCell != null)
|
|||
|
|
// {
|
|||
|
|
// return matchCell.ToString();
|
|||
|
|
// }
|
|||
|
|
//}
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
private string GetValueByKeyValue2(string columnName)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>keyValue<75>滻
|
|||
|
|
if (KeyValue.Count > 0 && KeyValue.ContainsKey(columnName))
|
|||
|
|
{
|
|||
|
|
return KeyValue[columnName];
|
|||
|
|
}
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private string GetValueByRequest3(string columnName, string key)
|
|||
|
|
{
|
|||
|
|
string replaceValue = string.Empty;
|
|||
|
|
if (HttpContext.Current != null && HttpContext.Current.Handler != null)
|
|||
|
|
{
|
|||
|
|
replaceValue = HttpContext.Current.Request[columnName] ?? HttpContext.Current.Request.Headers[columnName];
|
|||
|
|
}
|
|||
|
|
if (string.IsNullOrEmpty(replaceValue) && key.Contains(":"))//<2F><><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϵ<EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
replaceValue = key.Substring(key.LastIndexOf(':') + 1);
|
|||
|
|
}
|
|||
|
|
return replaceValue ?? "";
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>
|
|||
|
|
public partial class XHtmlAction
|
|||
|
|
{
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
MDataRow _Row;
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
|||
|
|
|
|||
|
|
public delegate string SetForeachEventHandler(string text, MDictionary<string, string> values, int rowIndex);
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>SetForeach<63><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĸ<C3B5>ʽ<EFBFBD><CABD><EFBFBD>¼<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public event SetForeachEventHandler OnForeach;
|
|||
|
|
public void SetForeach(MDataTable dataSource)
|
|||
|
|
{
|
|||
|
|
if (dataSource != null)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(dataSource.TableName + "View");
|
|||
|
|
if (node == null)
|
|||
|
|
{
|
|||
|
|
node = Get("defaultView");
|
|||
|
|
}
|
|||
|
|
if (node != null)
|
|||
|
|
{
|
|||
|
|
SetForeach(dataSource, node, node.InnerXml, OnForeach);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
public void SetForeach(MDataTable dataSource, string idOrName)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName);
|
|||
|
|
SetForeach(dataSource, node, node.InnerXml, OnForeach);
|
|||
|
|
}
|
|||
|
|
public void SetForeach(MDataTable dataSource, string idOrName, string text)
|
|||
|
|
{
|
|||
|
|
XmlNode node = Get(idOrName);
|
|||
|
|
SetForeach(dataSource, node, text, OnForeach);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SetForeach(MDataTable dataSource, string idOrName, SetType setType)
|
|||
|
|
{
|
|||
|
|
string text = string.Empty;
|
|||
|
|
XmlNode node = Get(idOrName);
|
|||
|
|
if (node == null)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
switch (setType)
|
|||
|
|
{
|
|||
|
|
case SetType.InnerText:
|
|||
|
|
text = node.InnerText;
|
|||
|
|
break;
|
|||
|
|
case SetType.InnerXml:
|
|||
|
|
text = node.InnerXml;
|
|||
|
|
break;
|
|||
|
|
case SetType.Value:
|
|||
|
|
case SetType.Href:
|
|||
|
|
case SetType.Src:
|
|||
|
|
case SetType.Class:
|
|||
|
|
case SetType.Disabled:
|
|||
|
|
case SetType.ID:
|
|||
|
|
case SetType.Name:
|
|||
|
|
case SetType.Visible:
|
|||
|
|
case SetType.Title:
|
|||
|
|
case SetType.Style:
|
|||
|
|
string key = setType.ToString().ToLower();
|
|||
|
|
if (node.Attributes[key] != null)
|
|||
|
|
{
|
|||
|
|
text = node.Attributes[key].Value;
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
SetForeach(dataSource, node, text, OnForeach);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void SetForeach(MDataTable dataSource, XmlNode node)
|
|||
|
|
{
|
|||
|
|
if (node == null) { return; }
|
|||
|
|
SetForeach(dataSource, node, node.InnerXml, OnForeach);
|
|||
|
|
}
|
|||
|
|
public void SetForeach(MDataTable dataSource, XmlNode node, string text)
|
|||
|
|
{
|
|||
|
|
if (node == null) { return; }
|
|||
|
|
SetForeach(dataSource, node, text, OnForeach);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><F3B6A8B4><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="dataSource"><3E><><EFBFBD><EFBFBD>Դ</param>
|
|||
|
|
/// <param name="node"><3E><><EFBFBD><EFBFBD><EFBFBD>Ľڵ<C4BD></param>
|
|||
|
|
/// <param name="text"><3E><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>node.InnerXml<6D><6C></param>
|
|||
|
|
/// <param name="eventOnForeach"><3E>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>¼<EFBFBD></param>
|
|||
|
|
public void SetForeach(MDataTable dataSource, XmlNode node, string text, SetForeachEventHandler eventOnForeach)
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
#region ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (node == null || string.IsNullOrEmpty(text))
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (dataSource == null || dataSource.Rows.Count == 0 || dataSource.Columns.Count == 0)
|
|||
|
|
{
|
|||
|
|
if (node.Attributes["clearflag"] == null)
|
|||
|
|
{
|
|||
|
|
node.InnerText = string.Empty;
|
|||
|
|
}
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
RemoveAttr(node, "clearflag");
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
StringBuilder innerXml = new StringBuilder();
|
|||
|
|
|
|||
|
|
for (int k = 0; k < dataSource.Rows.Count; k++)
|
|||
|
|
{
|
|||
|
|
string newText = text;
|
|||
|
|
MDictionary<string, string> values = GetFromRow(dataSource.Rows[k]);
|
|||
|
|
if (eventOnForeach != null)
|
|||
|
|
{
|
|||
|
|
newText = eventOnForeach(text, values, k);//<2F><><EFBFBD><EFBFBD>ÿһ<C3BF>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>text<78><74>
|
|||
|
|
}
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (newText.IndexOf("${") > -1 || newText.IndexOf("<%#") > -1)
|
|||
|
|
{
|
|||
|
|
newText = FormatHtml(newText, values);
|
|||
|
|
}
|
|||
|
|
innerXml.Append(newText);
|
|||
|
|
}
|
|||
|
|
catch (Exception err)
|
|||
|
|
{
|
|||
|
|
Log.Write(err, LogType.Error);
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
values.Clear();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
////<2F><>InnerText<78><74><EFBFBD>ܺã<DCBA><C3A3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
//node.InnerText = innerXml.ToString();
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
node.InnerXml = innerXml.ToString();
|
|||
|
|
}
|
|||
|
|
catch
|
|||
|
|
{
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
node.InnerXml = SetCDATA(innerXml.ToString());
|
|||
|
|
}
|
|||
|
|
catch (Exception err)
|
|||
|
|
{
|
|||
|
|
Log.Write(err, LogType.Error);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
finally
|
|||
|
|
{
|
|||
|
|
if (eventOnForeach != null)
|
|||
|
|
{
|
|||
|
|
eventOnForeach = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>ܼ<EFBFBD><DCBC>ٷ<EFBFBD><D9B7><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>ٷ<EFBFBD><D9B7><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private MDictionary<string, string> GetFromRow(MDataRow row)
|
|||
|
|
{
|
|||
|
|
MDictionary<string, string> keyValuePairs = new MDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|||
|
|
foreach (var item in row)
|
|||
|
|
{
|
|||
|
|
keyValuePairs.Add(item.ColumnName, item.StringValue);
|
|||
|
|
}
|
|||
|
|
return keyValuePairs;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD>滻ռλ<D5BC><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public MDictionary<string, string> KeyValue = new MDictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>MDatarow<6F><77><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>CMS<4D>滻<EFBFBD><E6BBBB>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="pre">Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>ָ<EFBFBD><D6B8>ǰ<C7B0><D7BA><EFBFBD>磺"a.",<2C><><EFBFBD><EFBFBD>ǰ<C7B0><D7BA>""</param>
|
|||
|
|
public void LoadData(object anyObjToRow, string pre)
|
|||
|
|
{
|
|||
|
|
LoadData(MDataRow.CreateFrom(anyObjToRow), pre);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SetFor<6F><72><EFBFBD><EFBFBD>ʹ<EFBFBD>û<EFBFBD>CMS<4D>滻<EFBFBD><E6BBBB>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="pre">Ϊ<><CEAA><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD>ָ<EFBFBD><D6B8>ǰ<C7B0><D7BA><EFBFBD>磺"a.",<2C><><EFBFBD><EFBFBD>ǰ<C7B0><D7BA>""<22><></param>
|
|||
|
|
public void LoadData(MDataRow row, string pre)
|
|||
|
|
{
|
|||
|
|
if (pre != null && row != null)
|
|||
|
|
{
|
|||
|
|
foreach (MDataCell cell in row)
|
|||
|
|
{
|
|||
|
|
if (cell.IsNullOrEmpty) { continue; }
|
|||
|
|
string cName = pre + cell.ColumnName;
|
|||
|
|
if (KeyValue.ContainsKey(cName))
|
|||
|
|
{
|
|||
|
|
KeyValue[cName] = cell.ToString();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
KeyValue.Add(cName, cell.ToString());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
_Row = row;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// װ<><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SetFor<6F><72><EFBFBD><EFBFBD>ʹ<EFBFBD>ã<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="row"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
public void LoadData(MDataRow row)
|
|||
|
|
{
|
|||
|
|
_Row = row;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Ϊ<>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>LoadData<74><61>ʹ<EFBFBD>á<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="idOrName"><3E>ڵ<EFBFBD><DAB5><EFBFBD>id<69><64>name</param>
|
|||
|
|
public void SetFor(string idOrName)
|
|||
|
|
{
|
|||
|
|
SetFor(idOrName, SetType.InnerXml);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Ϊ<>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>LoadData<74><61>ʹ<EFBFBD>á<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="setType"><3E>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
|||
|
|
public void SetFor(string idOrName, SetType setType)
|
|||
|
|
{
|
|||
|
|
SetFor(idOrName, setType, GetRowValue(idOrName));
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Ϊ<>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>LoadData<74><61>ʹ<EFBFBD>á<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="values">setTypeΪCustomʱ<6D><CAB1><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>硰"href","http://www.cyqdata.com","target","_blank"<22><></param>
|
|||
|
|
public void SetFor(string idOrName, SetType setType, params string[] values)
|
|||
|
|
{
|
|||
|
|
int i = setType == SetType.Custom ? 1 : 0;
|
|||
|
|
for (; i < values.Length; i++)
|
|||
|
|
{
|
|||
|
|
if (values[i].Contains(ValueReplace.New))
|
|||
|
|
{
|
|||
|
|
values[i] = values[i].Replace(ValueReplace.New, GetRowValue(idOrName));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Set(Get(idOrName), setType, values);
|
|||
|
|
}
|
|||
|
|
private string GetRowValue(string idOrName)
|
|||
|
|
{
|
|||
|
|
string rowValue = "";
|
|||
|
|
if (_Row != null)
|
|||
|
|
{
|
|||
|
|
MDataCell cell = _Row[idOrName];
|
|||
|
|
if (cell == null && idOrName.Length > 3)
|
|||
|
|
{
|
|||
|
|
cell = _Row[idOrName.Substring(3)];
|
|||
|
|
}
|
|||
|
|
if (cell != null)
|
|||
|
|
{
|
|||
|
|
rowValue = cell.IsNull ? "" : cell.StringValue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return rowValue;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
|
|||
|
|
public override void Dispose()
|
|||
|
|
{
|
|||
|
|
base.Dispose();
|
|||
|
|
KeyValue.Clear();
|
|||
|
|
_Row = null;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// Json <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public partial class XHtmlAction
|
|||
|
|
{
|
|||
|
|
#region תJson
|
|||
|
|
/// <summary>
|
|||
|
|
/// תJson
|
|||
|
|
/// </summary>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public string ToJson()
|
|||
|
|
{
|
|||
|
|
return ToJson(XmlDoc.DocumentElement, true);
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// תJson
|
|||
|
|
/// <param name="parent"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ڵ㣨Ĭ<E3A3A8>ϸ<EFBFBD><CFB8>ڵ㣩</param>
|
|||
|
|
/// <param name="isWithAttr"><3E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵҲ<D6B5><D2B2><EFBFBD><EFBFBD></param>
|
|||
|
|
/// </summary>
|
|||
|
|
public string ToJson(XmlNode parent, bool isWithAttr)
|
|||
|
|
{
|
|||
|
|
parent = parent ?? XmlDoc.DocumentElement;
|
|||
|
|
if (parent == null)
|
|||
|
|
{
|
|||
|
|
return string.Empty;
|
|||
|
|
}
|
|||
|
|
JsonHelper js = new JsonHelper(false, false);
|
|||
|
|
//<2F>ֽ<EFBFBD><D6BD>ݹ飬<DDB9><E9A3AC>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD>費<EFBFBD>õ<EFBFBD><C3B5><EFBFBD>
|
|||
|
|
|
|||
|
|
js.Add(parent.Name, GetRootJson(parent, isWithAttr), true);
|
|||
|
|
js.AddBr();
|
|||
|
|
return js.ToString();
|
|||
|
|
}
|
|||
|
|
private string GetRootJson(XmlNode root, bool isWithAttr)
|
|||
|
|
{
|
|||
|
|
JsonHelper js = new JsonHelper(false, false);
|
|||
|
|
//js.Escape = EscapeOp.No;
|
|||
|
|
if (isWithAttr && root.Attributes != null && root.Attributes.Count > 0)
|
|||
|
|
{
|
|||
|
|
foreach (XmlAttribute item in root.Attributes)
|
|||
|
|
{
|
|||
|
|
js.Add(item.Name, item.Value);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if (root.HasChildNodes)
|
|||
|
|
{
|
|||
|
|
foreach (XmlNode item in root.ChildNodes)
|
|||
|
|
{
|
|||
|
|
string childJson = GetChildJson(item, isWithAttr);
|
|||
|
|
js.Add(item.Name, childJson, !string.IsNullOrEmpty(childJson) && (childJson[0] == '{' || childJson[0] == '['));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
string result = js.ToString();
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
private string GetChildJson(XmlNode parent, bool isWithAttr)
|
|||
|
|
{
|
|||
|
|
JsonHelper js = new JsonHelper(false, false);
|
|||
|
|
//js.Escape = EscapeOp.No;
|
|||
|
|
if (isWithAttr && parent.Attributes != null && parent.Attributes.Count > 0)
|
|||
|
|
{
|
|||
|
|
foreach (XmlAttribute item in parent.Attributes)
|
|||
|
|
{
|
|||
|
|
js.Add(item.Name, item.Value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
if (parent.HasChildNodes)
|
|||
|
|
{
|
|||
|
|
XmlNode x0 = parent.ChildNodes[0];//XXList xx
|
|||
|
|
int childCount = parent.ChildNodes.Count;
|
|||
|
|
if (x0.NodeType != XmlNodeType.Element && childCount == 1)
|
|||
|
|
{
|
|||
|
|
if (js.RowCount == 0)
|
|||
|
|
{
|
|||
|
|
return parent.InnerText;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
js.Add(parent.Name, parent.InnerText);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
#region MyRegion
|
|||
|
|
|
|||
|
|
|
|||
|
|
MDictionary<string, StringBuilder> jsonDic = new MDictionary<string, StringBuilder>(StringComparer.OrdinalIgnoreCase);
|
|||
|
|
List<string> arrayName = new List<string>();
|
|||
|
|
foreach (XmlNode item in parent.ChildNodes)
|
|||
|
|
{
|
|||
|
|
string childJson = GetChildJson(item, isWithAttr);
|
|||
|
|
if (!jsonDic.ContainsKey(item.Name))
|
|||
|
|
{
|
|||
|
|
StringBuilder sb = new StringBuilder();
|
|||
|
|
sb.Append(childJson);
|
|||
|
|
jsonDic.Add(item.Name, sb);
|
|||
|
|
}
|
|||
|
|
else // <20>ظ<EFBFBD><D8B8><EFBFBD>TagName
|
|||
|
|
{
|
|||
|
|
if (!arrayName.Contains(item.Name))
|
|||
|
|
{
|
|||
|
|
arrayName.Add(item.Name);
|
|||
|
|
}
|
|||
|
|
jsonDic[item.Name].Append("," + childJson);// = "[" + jsonDic[item.Name].TrimStart('[').TrimEnd(']') + "," + childJson + "]";
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
bool isList = parent.Name.EndsWith("List") && jsonDic.Count == 1;
|
|||
|
|
string cName = parent.Name.Substring(0, parent.Name.Length - 4);
|
|||
|
|
foreach (KeyValuePair<string, StringBuilder> kv in jsonDic)
|
|||
|
|
{
|
|||
|
|
string v = kv.Value.ToString();
|
|||
|
|
if (v.Length > 0 && v[0] != '[' && (isList || arrayName.Contains(kv.Key)))
|
|||
|
|
{
|
|||
|
|
v = "[" + v + "]";
|
|||
|
|
}
|
|||
|
|
if (isList && kv.Key == cName)
|
|||
|
|
{
|
|||
|
|
return v;
|
|||
|
|
// js.Add(parent.Name, v, true);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
js.Add(kv.Key, v, !string.IsNullOrEmpty(v) && (v[0] == '{' || v[0] == '['));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
jsonDic.Clear();
|
|||
|
|
jsonDic = null;
|
|||
|
|
arrayName.Clear();
|
|||
|
|
arrayName = null;
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
js.AddBr();
|
|||
|
|
string result = js.ToString();
|
|||
|
|
if (result == "{}")
|
|||
|
|
{
|
|||
|
|
return "";
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (js.RowCount == 0)
|
|||
|
|
{
|
|||
|
|
return "";
|
|||
|
|
// return "fuck"; //<2F>Բۣ<D4B2><DBA3><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4>룿
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return result;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
}
|